From fa2dbb2b89343d6dcdba3d66e0610ffa925d4cb6 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 19 Dec 2018 23:18:57 +0000 Subject: [PATCH] Update to WorldEdit 7 (and WE7-compatible schematics, *hopefully keeping legacy*) --- Bukkit/build.gradle | 1 + .../plotsquared/bukkit/BukkitMain.java | 100 +--- .../bukkit/object/schematic/StateWrapper.java | 50 +- .../bukkit/util/BukkitLegacyMappings.java | 25 +- .../bukkit/util/BukkitSchematicHandler.java | 254 ++++------ .../plotsquared/bukkit/util/BukkitUtil.java | 4 + .../plotsquared/jnbt/ByteArrayTag.java | 50 -- .../plotsquared/jnbt/ByteTag.java | 42 -- .../plotsquared/jnbt/CompoundTag.java | 370 -------------- .../plotsquared/jnbt/CompoundTagBuilder.java | 186 ------- .../plotsquared/jnbt/DoubleTag.java | 42 -- .../plotsquared/jnbt/EndTag.java | 21 - .../plotsquared/jnbt/FloatTag.java | 42 -- .../plotsquared/jnbt/IntArrayTag.java | 54 --- .../plotsquared/jnbt/IntTag.java | 42 -- .../plotsquared/jnbt/ListTag.java | 375 -------------- .../plotsquared/jnbt/ListTagBuilder.java | 111 ----- .../plotsquared/jnbt/LongTag.java | 42 -- .../plotsquared/jnbt/NBTConstants.java | 59 --- .../plotsquared/jnbt/NBTInputStream.java | 185 ------- .../plotsquared/jnbt/NBTOutputStream.java | 249 ---------- .../plotsquared/jnbt/NBTUtils.java | 148 ------ .../plotsquared/jnbt/ShortTag.java | 42 -- .../plotsquared/jnbt/StringTag.java | 46 -- .../plotsquared/jnbt/Tag.java | 44 -- .../plotsquared/plot/PlotSquared.java | 2 +- .../plotsquared/plot/commands/Download.java | 2 +- .../plotsquared/plot/commands/Load.java | 4 +- .../plotsquared/plot/commands/Save.java | 2 +- .../plot/commands/SchematicCmd.java | 16 +- .../plotsquared/plot/config/C.java | 10 +- .../plotsquared/plot/generator/HybridGen.java | 12 +- .../plot/generator/HybridPlotManager.java | 2 +- .../plot/generator/HybridPlotWorld.java | 287 +++++------ .../plot/generator/HybridUtils.java | 10 +- .../plot/listener/ProcessedWEExtent.java | 210 +++----- .../plotsquared/plot/listener/WEExtent.java | 33 +- .../plotsquared/plot/listener/WEManager.java | 30 +- .../plotsquared/plot/object/Location.java | 63 +-- .../plotsquared/plot/object/Plot.java | 20 +- .../plotsquared/plot/object/PlotBlock.java | 68 +-- .../plot/object/StringPlotBlock.java | 35 +- .../plot/object/schematic/Schematic.java | 47 ++ .../plot/object/schematic/StoredEntity.java | 54 +++ .../plot/util/SchematicHandler.java | 457 ++++-------------- .../plotsquared/plot/util/WorldUtil.java | 15 +- .../plot/util/block/BasicLocalBlockQueue.java | 48 +- .../util/block/DelegateLocalBlockQueue.java | 5 + .../plot/util/block/LocalBlockQueue.java | 5 +- .../util/block/OffsetLocalBlockQueue.java | 6 +- .../util/block/ScopedLocalBlockQueue.java | 10 +- build.gradle | 2 +- 52 files changed, 742 insertions(+), 3297 deletions(-) delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ByteArrayTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ByteTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/CompoundTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/CompoundTagBuilder.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/DoubleTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/EndTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/FloatTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/IntArrayTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/IntTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ListTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ListTagBuilder.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/LongTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTConstants.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTInputStream.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTOutputStream.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTUtils.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ShortTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/StringTag.java delete mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/Tag.java create mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/schematic/Schematic.java create mode 100644 Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/schematic/StoredEntity.java diff --git a/Bukkit/build.gradle b/Bukkit/build.gradle index 62ee654b2..af38aea0f 100644 --- a/Bukkit/build.gradle +++ b/Bukkit/build.gradle @@ -8,6 +8,7 @@ repositories { dependencies { compile project(':Core') compile 'org.spigotmc:spigot-api:1.13-R0.1-SNAPSHOT' + compile(group: 'com.sk89q.worldedit', name: 'worldedit-bukkit', version: '7.0.0-SNAPSHOT') compile("net.milkbowl.vault:VaultAPI:1.6") { exclude module: 'bukkit' } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java index 0b816b550..70e3301ce 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java @@ -1,47 +1,14 @@ package com.github.intellectualsites.plotsquared.bukkit; -import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils.getRefClass; - import com.github.intellectualsites.plotsquared.bukkit.database.plotme.ClassicPlotMeConnector; import com.github.intellectualsites.plotsquared.bukkit.database.plotme.LikePlotMeConverter; import com.github.intellectualsites.plotsquared.bukkit.database.plotme.PlotMeConnector_017; import com.github.intellectualsites.plotsquared.bukkit.generator.BukkitPlotGenerator; -import com.github.intellectualsites.plotsquared.bukkit.listeners.ChunkListener; -import com.github.intellectualsites.plotsquared.bukkit.listeners.EntityPortal_1_7_9; -import com.github.intellectualsites.plotsquared.bukkit.listeners.EntitySpawnListener; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlayerEvents; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlayerEvents183; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlayerEvents_1_8; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlayerEvents_1_9; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlotPlusListener; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlotPlusListener_1_12; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlotPlusListener_Legacy; -import com.github.intellectualsites.plotsquared.bukkit.listeners.SingleWorldListener; -import com.github.intellectualsites.plotsquared.bukkit.listeners.WorldEvents; +import com.github.intellectualsites.plotsquared.bukkit.listeners.*; import com.github.intellectualsites.plotsquared.bukkit.titles.DefaultTitle_111; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitBlockRegistry; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitChatManager; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitChunkManager; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitCommand; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitEconHandler; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitEventUtil; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitHybridUtils; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitInventoryUtil; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitLegacyMappings; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitSchematicHandler; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitSetupUtils; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitTaskManager; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitUtil; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitVersion; -import com.github.intellectualsites.plotsquared.bukkit.util.Metrics; -import com.github.intellectualsites.plotsquared.bukkit.util.SendChunk; -import com.github.intellectualsites.plotsquared.bukkit.util.SetGenCB; +import com.github.intellectualsites.plotsquared.bukkit.util.*; import com.github.intellectualsites.plotsquared.bukkit.util.block.BukkitLocalQueue; -import com.github.intellectualsites.plotsquared.bukkit.uuid.DefaultUUIDWrapper; -import com.github.intellectualsites.plotsquared.bukkit.uuid.FileUUIDHandler; -import com.github.intellectualsites.plotsquared.bukkit.uuid.LowerOfflineUUIDWrapper; -import com.github.intellectualsites.plotsquared.bukkit.uuid.OfflineUUIDWrapper; -import com.github.intellectualsites.plotsquared.bukkit.uuid.SQLUUIDHandler; +import com.github.intellectualsites.plotsquared.bukkit.uuid.*; import com.github.intellectualsites.plotsquared.configuration.ConfigurationSection; import com.github.intellectualsites.plotsquared.plot.IPlotMain; import com.github.intellectualsites.plotsquared.plot.PlotSquared; @@ -52,58 +19,20 @@ import com.github.intellectualsites.plotsquared.plot.generator.GeneratorWrapper; import com.github.intellectualsites.plotsquared.plot.generator.HybridGen; import com.github.intellectualsites.plotsquared.plot.generator.HybridUtils; import com.github.intellectualsites.plotsquared.plot.generator.IndependentPlotGenerator; -import com.github.intellectualsites.plotsquared.plot.object.BlockRegistry; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotArea; -import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; -import com.github.intellectualsites.plotsquared.plot.object.SetupObject; +import com.github.intellectualsites.plotsquared.plot.object.*; import com.github.intellectualsites.plotsquared.plot.object.chat.PlainChatManager; import com.github.intellectualsites.plotsquared.plot.object.worlds.PlotAreaManager; import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotArea; import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotAreaManager; import com.github.intellectualsites.plotsquared.plot.object.worlds.SingleWorldGenerator; -import com.github.intellectualsites.plotsquared.plot.util.AbstractTitle; -import com.github.intellectualsites.plotsquared.plot.util.ChatManager; -import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; -import com.github.intellectualsites.plotsquared.plot.util.ConsoleColors; -import com.github.intellectualsites.plotsquared.plot.util.EconHandler; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; -import com.github.intellectualsites.plotsquared.plot.util.InventoryUtil; -import com.github.intellectualsites.plotsquared.plot.util.LegacyMappings; -import com.github.intellectualsites.plotsquared.plot.util.MainUtil; -import com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils; -import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; -import com.github.intellectualsites.plotsquared.plot.util.SetupUtils; -import com.github.intellectualsites.plotsquared.plot.util.StringMan; -import com.github.intellectualsites.plotsquared.plot.util.TaskManager; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandlerImplementation; -import com.github.intellectualsites.plotsquared.plot.util.WorldUtil; +import com.github.intellectualsites.plotsquared.plot.util.*; import com.github.intellectualsites.plotsquared.plot.util.block.QueueProvider; import com.github.intellectualsites.plotsquared.plot.uuid.UUIDWrapper; import com.sk89q.worldedit.WorldEdit; -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import javax.annotation.Nullable; import lombok.Getter; import lombok.NonNull; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Chunk; +import org.bukkit.*; import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -116,6 +45,15 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import javax.annotation.Nullable; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils.getRefClass; + public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain { @Getter private static WorldEdit worldEdit; @@ -168,12 +106,13 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain } private final LegacyMappings legacyMappings = new BukkitLegacyMappings(); + private final BlockRegistry blockRegistry = + new BukkitBlockRegistry(Material.values()); private int[] version; @Getter private String pluginName; @Getter private SingleWorldListener singleWorldListener; private Method methodUnloadChunk0; private boolean methodUnloadSetup = false; - private final BlockRegistry blockRegistry = new BukkitBlockRegistry(Material.values()); @Override public int[] getServerVersion() { if (this.version == null) { @@ -927,11 +866,10 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain return names; } - @Override - public BlockRegistry getBlockRegistry() { + @Override public BlockRegistry getBlockRegistry() { return this.blockRegistry; } - + @Override public LegacyMappings getLegacyMappings() { return this.legacyMappings; } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/schematic/StateWrapper.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/schematic/StateWrapper.java index 5ea8f62ee..cfc84338a 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/schematic/StateWrapper.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/schematic/StateWrapper.java @@ -1,9 +1,8 @@ package com.github.intellectualsites.plotsquared.bukkit.object.schematic; import com.github.intellectualsites.plotsquared.bukkit.util.BukkitUtil; -import com.github.intellectualsites.plotsquared.jnbt.*; -import com.github.intellectualsites.plotsquared.plot.object.schematic.ItemType; -import com.github.intellectualsites.plotsquared.plot.util.MathMan; +import com.sk89q.jnbt.*; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockState; @@ -39,21 +38,14 @@ public class StateWrapper { case "chest": List itemsTag = this.tag.getListTag("Items").getValue(); int length = itemsTag.size(); - short[] ids = new short[length]; - byte[] datas = new byte[length]; + String[] ids = new String[length]; byte[] amounts = new byte[length]; byte[] slots = new byte[length]; for (int i = 0; i < length; i++) { Tag itemTag = itemsTag.get(i); CompoundTag itemComp = (CompoundTag) itemTag; - short id = itemComp.getShort("id"); - String idStr = itemComp.getString("id"); - if (idStr != null && !MathMan.isInteger(idStr)) { - idStr = idStr.split(":")[1].toLowerCase(); - id = (short) ItemType.getId(idStr); - } + String id = itemComp.getString("id"); ids[i] = id; - datas[i] = (byte) itemComp.getShort("Damage"); amounts[i] = itemComp.getByte("Count"); slots[i] = itemComp.getByte("Slot"); } @@ -67,7 +59,8 @@ public class StateWrapper { InventoryHolder holder = (InventoryHolder) state; Inventory inv = holder.getInventory(); for (int i = 0; i < ids.length; i++) { - ItemStack item = new ItemStack(ids[i], amounts[i], datas[i]); + ItemStack item = + new ItemStack(Material.getMaterial(ids[i]), (int) amounts[i]); inv.addItem(item); } state.update(true); @@ -85,8 +78,7 @@ public class StateWrapper { InventoryHolder inv = (InventoryHolder) this.state; ItemStack[] contents = inv.getInventory().getContents(); Map values = new HashMap<>(); - values.put("Items", - new ListTag("Items", CompoundTag.class, serializeInventory(contents))); + values.put("Items", new ListTag(CompoundTag.class, serializeInventory(contents))); return new CompoundTag(values); } return null; @@ -101,41 +93,29 @@ public class StateWrapper { for (int i = 0; i < items.length; ++i) { if (items[i] != null) { Map tagData = serializeItem(items[i]); - tagData.put("Slot", new ByteTag("Slot", (byte) i)); + tagData.put("Slot", new ByteTag((byte) i)); tags.add(new CompoundTag(tagData)); } } return tags; } - /* - * TODO: Move this into the sponge module! - * - public Map serializeItem(final org.spongepowered.api.item.inventory.ItemStack item) { - final Map data = new HashMap(); - - // FIXME serialize sponge item - - return data; - } - */ - public Map serializeItem(ItemStack item) { Map data = new HashMap<>(); - data.put("id", new ShortTag("id", (short) item.getTypeId())); - data.put("Damage", new ShortTag("Damage", item.getDurability())); - data.put("Count", new ByteTag("Count", (byte) item.getAmount())); + data.put("id", new StringTag(item.getType().name())); + data.put("Damage", new ShortTag(item.getDurability())); + data.put("Count", new ByteTag((byte) item.getAmount())); if (!item.getEnchantments().isEmpty()) { List enchantmentList = new ArrayList<>(); for (Entry entry : item.getEnchantments().entrySet()) { Map enchantment = new HashMap<>(); - enchantment.put("id", new ShortTag("id", (short) entry.getKey().getId())); - enchantment.put("lvl", new ShortTag("lvl", entry.getValue().shortValue())); + enchantment.put("id", new StringTag(entry.getKey().toString())); + enchantment.put("lvl", new ShortTag(entry.getValue().shortValue())); enchantmentList.add(new CompoundTag(enchantment)); } Map auxData = new HashMap<>(); - auxData.put("ench", new ListTag("ench", CompoundTag.class, enchantmentList)); - data.put("tag", new CompoundTag("tag", auxData)); + auxData.put("ench", new ListTag(CompoundTag.class, enchantmentList)); + data.put("tag", new CompoundTag(auxData)); } return data; } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitLegacyMappings.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitLegacyMappings.java index df27b4f2d..b92b6edfe 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitLegacyMappings.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitLegacyMappings.java @@ -5,20 +5,12 @@ import com.github.intellectualsites.plotsquared.plot.object.PlotBlock; import com.github.intellectualsites.plotsquared.plot.object.StringPlotBlock; import com.github.intellectualsites.plotsquared.plot.util.LegacyMappings; import com.github.intellectualsites.plotsquared.plot.util.StringComparison; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.stream.Collectors; -import lombok.AccessLevel; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.ToString; +import lombok.*; import org.bukkit.Material; +import java.util.*; +import java.util.stream.Collectors; + /** * Borrowed from https://github.com/Phoenix616/IDConverter/blob/master/mappings/src/main/java/de/themoep/idconverter/IdMappings.java * Original License: @@ -705,8 +697,10 @@ public class BukkitLegacyMappings extends LegacyMappings { .collect(Collectors.toList()); } - public StringComparison.ComparisonResult getClosestsMatch(@NonNull final String string) { - final StringComparison comparison = new StringComparison<>(string, getPlotBlocks()); + public StringComparison.ComparisonResult getClosestsMatch( + @NonNull final String string) { + final StringComparison comparison = + new StringComparison<>(string, getPlotBlocks()); return comparison.getBestMatchAdvanced(); } @@ -812,8 +806,7 @@ public class BukkitLegacyMappings extends LegacyMappings { return LegacyPlotBlock.get(numericalId, dataValue); } - @Override - public String toString() { + @Override public String toString() { return this.newName; } } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitSchematicHandler.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitSchematicHandler.java index 0a602357b..c3e35b1cf 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitSchematicHandler.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitSchematicHandler.java @@ -1,28 +1,29 @@ package com.github.intellectualsites.plotsquared.bukkit.util; import com.github.intellectualsites.plotsquared.bukkit.object.schematic.StateWrapper; -import com.github.intellectualsites.plotsquared.jnbt.*; import com.github.intellectualsites.plotsquared.plot.object.ChunkLoc; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.RegionWrapper; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; -import com.github.intellectualsites.plotsquared.plot.util.LegacyMappings; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; import com.github.intellectualsites.plotsquared.plot.util.TaskManager; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; +import com.sk89q.jnbt.*; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldedit.world.block.BaseBlock; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; +import java.io.ByteArrayOutputStream; import java.util.*; /** * Schematic Handler. */ -public class BukkitSchematicHandler extends SchematicHandler { +public abstract class BukkitSchematicHandler extends SchematicHandler { @Override public void getCompoundTag(final String world, final Set regions, final RunnableVal whenDone) { @@ -34,25 +35,35 @@ public class BukkitSchematicHandler extends SchematicHandler { final Location bot = corners[0]; Location top = corners[1]; + CuboidRegion cuboidRegion = + new CuboidRegion(BukkitUtil.IMP.getWeWorld(world), bot.getBlockVector3(), + top.getBlockVector3()); + final int width = top.getX() - bot.getX() + 1; int height = top.getY() - bot.getY() + 1; final int length = top.getZ() - bot.getZ() + 1; - // Main Schematic tag - final HashMap schematic = new HashMap<>(); - schematic.put("Width", new ShortTag("Width", (short) width)); - schematic.put("Length", new ShortTag("Length", (short) length)); - schematic.put("Height", new ShortTag("Height", (short) height)); - schematic.put("Materials", new StringTag("Materials", "Alpha")); - schematic.put("WEOriginX", new IntTag("WEOriginX", 0)); - schematic.put("WEOriginY", new IntTag("WEOriginY", 0)); - schematic.put("WEOriginZ", new IntTag("WEOriginZ", 0)); - schematic.put("WEOffsetX", new IntTag("WEOffsetX", 0)); - schematic.put("WEOffsetY", new IntTag("WEOffsetY", 0)); - schematic.put("WEOffsetZ", new IntTag("WEOffsetZ", 0)); - // Arrays of data types - final List tileEntities = new ArrayList<>(); - final byte[] blocks = new byte[width * height * length]; - final byte[] blockData = new byte[width * height * length]; + Map schematic = new HashMap<>(); + schematic.put("Version", new IntTag(1)); + + Map metadata = new HashMap<>(); + metadata.put("WEOffsetX", new IntTag(0)); + metadata.put("WEOffsetY", new IntTag(0)); + metadata.put("WEOffsetZ", new IntTag(0)); + + schematic.put("Metadata", new CompoundTag(metadata)); + + schematic.put("Width", new ShortTag((short) width)); + schematic.put("Height", new ShortTag((short) height)); + schematic.put("Length", new ShortTag((short) length)); + + // The Sponge format Offset refers to the 'min' points location in the world. That's our 'Origin' + schematic.put("Offset", new IntArrayTag(new int[] {0, 0, 0,})); + + final int[] paletteMax = {0}; + Map palette = new HashMap<>(); + + List tileEntities = new ArrayList<>(); + ByteArrayOutputStream buffer = new ByteArrayOutputStream(width * height * length); // Queue final ArrayDeque queue = new ArrayDeque<>(regions); TaskManager.runTask(new Runnable() { @@ -60,15 +71,18 @@ public class BukkitSchematicHandler extends SchematicHandler { if (queue.isEmpty()) { TaskManager.runTaskAsync(new Runnable() { @Override public void run() { - schematic.put("Blocks", new ByteArrayTag("Blocks", blocks)); - schematic.put("Data", new ByteArrayTag("Data", blockData)); - schematic.put("Entities", - new ListTag("Entities", CompoundTag.class, - new ArrayList())); + schematic.put("PaletteMax", new IntTag(paletteMax[0])); + + Map paletteTag = new HashMap<>(); + palette.forEach( + (key, value) -> paletteTag.put(key, new IntTag(value))); + + schematic.put("Palette", new CompoundTag(paletteTag)); + schematic + .put("BlockData", new ByteArrayTag(buffer.toByteArray())); schematic.put("TileEntities", - new ListTag("TileEntities", CompoundTag.class, - tileEntities)); - whenDone.value = new CompoundTag("Schematic", schematic); + new ListTag(CompoundTag.class, tileEntities)); + whenDone.value = new CompoundTag(schematic); TaskManager.runTask(whenDone); System.gc(); System.gc(); @@ -140,148 +154,48 @@ public class BukkitSchematicHandler extends SchematicHandler { for (int x = xxb; x <= xxt; x++) { int rx = x - bx; int index = i2 + rx; - Block block = worldObj.getBlockAt(x, y, z); - int id = LegacyMappings.fromNewName(block.getType().name()).getNumericalId(); - switch (id) { - case 0: - case 2: - case 4: - case 13: - case 14: - case 15: - case 20: - case 21: - case 22: - case 24: - case 30: - case 32: - case 37: - case 39: - case 40: - case 41: - case 42: - case 45: - case 46: - case 47: - case 48: - case 49: - case 51: - case 55: - case 56: - case 57: - case 58: - case 60: - case 7: - case 8: - case 9: - case 10: - case 11: - case 73: - case 74: - case 78: - case 79: - case 80: - case 81: - case 82: - case 83: - case 85: - case 87: - case 88: - case 101: - case 102: - case 103: - case 110: - case 112: - case 113: - case 121: - case 122: - case 129: - case 133: - case 165: - case 166: - case 169: - case 170: - case 172: - case 173: - case 174: - case 181: - case 182: - case 188: - case 189: - case 190: - case 191: - case 192: - break; - case 54: - case 130: - case 142: - case 27: - case 137: - case 52: - case 154: - case 84: - case 25: - case 144: - case 138: - case 176: - case 177: - case 63: - case 68: - case 323: - case 117: - case 116: - case 28: - case 66: - case 157: - case 61: - case 62: - case 140: - case 146: - case 149: - case 150: - case 158: - case 23: - case 123: - case 124: - case 29: - case 33: - case 151: - case 178: - // TODO implement fully - BlockState state = block.getState(); - if (state != null) { - StateWrapper wrapper = - new StateWrapper(state); - CompoundTag rawTag = wrapper.getTag(); - if (rawTag != null) { - Map values = - new HashMap<>( - rawTag.getValue()); - values.put("id", new StringTag("id", - wrapper.getId())); - values.put("x", new IntTag("x", x)); - values.put("y", new IntTag("y", y)); - values.put("z", new IntTag("z", z)); - CompoundTag tileEntityTag = - new CompoundTag(values); - tileEntities.add(tileEntityTag); - } - } - default: - blockData[index] = block.getData(); + BlockVector3 point = BlockVector3.at(x, y, z); + BaseBlock block = + cuboidRegion.getWorld().getFullBlock(point); + if (block.getNbtData() != null) { + Map values = new HashMap<>(); + for (Map.Entry entry : block + .getNbtData().getValue().entrySet()) { + values + .put(entry.getKey(), entry.getValue()); + } + + values.remove( + "id"); // Remove 'id' if it exists. We want 'Id' + + // Positions are kept in NBT, we don't want that. + values.remove("x"); + values.remove("y"); + values.remove("z"); + + values + .put("Id", new StringTag(block.getNbtId())); + values.put("Pos", + new IntArrayTag(new int[] {x, y, z})); + + tileEntities.add(new CompoundTag(values)); } - // For optimization reasons, we are not supporting custom data types - // Especially since the most likely reason beyond this range is modded servers in which the blocks - // have NBT - // if (type > 255) { - // if (addBlocks == null) { - // addBlocks = new byte[(blocks.length >> 1) + 1]; - // } - // addBlocks[index >> 1] = (byte) (((index & 1) == 0) ? - // (addBlocks[index >> 1] & 0xF0) | ((type >> 8) & 0xF) : (addBlocks[index >> 1] & 0xF) | (((type - // >> 8) & 0xF) << 4)); - // } - blocks[index] = (byte) id; + String blockKey = + block.toImmutableState().getAsString(); + int blockId; + if (palette.containsKey(blockKey)) { + blockId = palette.get(blockKey); + } else { + blockId = paletteMax[0]; + palette.put(blockKey, blockId); + paletteMax[0]++; + } + + while ((blockId & -128) != 0) { + buffer.write(blockId & 127 | 128); + blockId >>>= 7; + } + buffer.write(blockId); } } } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitUtil.java index 88d51d7ed..b6bcaf62d 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitUtil.java @@ -467,6 +467,10 @@ import org.bukkit.material.Wool; } } + public com.sk89q.worldedit.world.World getWeWorld(String world) { + return new BukkitWorld(Bukkit.getWorld(world)); + } + @Override public PlotBlock getBlock(@NonNull final Location location) { final World world = getWorld(location.getWorld()); final Block block = world.getBlockAt(location.getX(), location.getY(), location.getZ()); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ByteArrayTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ByteArrayTag.java deleted file mode 100644 index ffb013554..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ByteArrayTag.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * The {@code TAG_Byte_Array} tag. - */ -public final class ByteArrayTag extends Tag { - - private final byte[] value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public ByteArrayTag(byte[] value) { - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public ByteArrayTag(String name, byte[] value) { - super(name); - this.value = value; - } - - @Override public byte[] getValue() { - return this.value; - } - - @Override public String toString() { - StringBuilder hex = new StringBuilder(); - for (byte b : this.value) { - String hexDigits = Integer.toHexString(b).toUpperCase(); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_Byte_Array" + append + ": " + hex; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ByteTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ByteTag.java deleted file mode 100644 index 786b03251..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ByteTag.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * The {@code TAG_Byte} tag. - */ -public final class ByteTag extends Tag { - - private final byte value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public ByteTag(byte value) { - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public ByteTag(String name, byte value) { - super(name); - this.value = value; - } - - @Override public Byte getValue() { - return this.value; - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_Byte" + append + ": " + this.value; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/CompoundTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/CompoundTag.java deleted file mode 100644 index 0aa98a9ca..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/CompoundTag.java +++ /dev/null @@ -1,370 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The {@code TAG_Compound} tag. - */ -public final class CompoundTag extends Tag { - - private Map value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public CompoundTag(Map value) { - this.value = Collections.unmodifiableMap(value); - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public CompoundTag(String name, Map value) { - super(name); - this.value = Collections.unmodifiableMap(value); - } - - /** - * Returns whether this compound tag contains the given key. - * - * @param key the given key - * @return true if the tag contains the given key - */ - public boolean containsKey(String key) { - return this.value.containsKey(key); - } - - @Override public Map getValue() { - return this.value; - } - - /** - * Return a new compound tag with the given values. - * - * @param value the value - * @return the new compound tag - */ - public CompoundTag setValue(Map value) { - if (value == null) { - this.value = Collections.unmodifiableMap(new HashMap()); - } else { - this.value = Collections.unmodifiableMap(value); - } - return this; - } - - /** - * Create a compound tag builder. - * - * @return the builder - */ - public CompoundTagBuilder createBuilder() { - return new CompoundTagBuilder(new HashMap(this.value)); - } - - /** - * Get a byte array named with the given key. - *

- *

If the key does not exist or its value is not a byte array - * tag, then an empty byte array will be returned.

- * - * @param key the key - * @return a byte array - */ - public byte[] getByteArray(String key) { - Tag tag = this.value.get(key); - if (tag instanceof ByteArrayTag) { - return ((ByteArrayTag) tag).getValue(); - } else { - return new byte[0]; - } - } - - /** - * Get a byte named with the given key.

If the key does not exist or its value is not a byte tag, then - * {@code 0} will be returned.

- * - * @param key the key - * @return a byte - */ - public byte getByte(String key) { - Tag tag = this.value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else { - return (byte) 0; - } - } - - /** - * Get a double named with the given key.

If the key does not exist or its value is not a double tag, then - * {@code 0} will be returned.

- * - * @param key the key - * @return a double - */ - public double getDouble(String key) { - Tag tag = this.value.get(key); - if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get a double named with the given key, even if it's another type of number.

If the key does not exist or - * its value is not a number, then {@code 0} will be returned.

- * - * @param key the key - * @return a double - */ - public double asDouble(String key) { - Tag tag = this.value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get a float named with the given key.

If the key does not exist or its value is not a float tag, then - * {@code 0} will be returned.

- * - * @param key the key - * @return a float - */ - public float getFloat(String key) { - Tag tag = this.value.get(key); - if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get a {@code int[]} named with the given key.

If the key does not exist or its value is not an int array - * tag, then an empty array will be returned.

- * - * @param key the key - * @return an int array - */ - public int[] getIntArray(String key) { - Tag tag = this.value.get(key); - if (tag instanceof IntArrayTag) { - return ((IntArrayTag) tag).getValue(); - } else { - return new int[0]; - } - } - - /** - * Get an int named with the given key.

If the key does not exist or its value is not an int tag, then - * {@code 0} will be returned.

- * - * @param key the key - * @return an int - */ - public int getInt(String key) { - Tag tag = this.value.get(key); - if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get an int named with the given key, even if it's another type of number.

If the key does not exist or - * its value is not a number, then {@code 0} will be returned.

- * - * @param key the key - * @return an int - */ - public int asInt(String key) { - Tag tag = this.value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue().intValue(); - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().intValue(); - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().intValue(); - } else { - return 0; - } - } - - /** - * Get a list of tags named with the given key.

If the key does not exist or its value is not a list tag, - * then an empty list will be returned.

- * - * @param key the key - * @return a list of tags - */ - public List getList(String key) { - Tag tag = this.value.get(key); - if (tag instanceof ListTag) { - return ((ListTag) tag).getValue(); - } else { - return Collections.emptyList(); - } - } - - /** - * Get a {@code TagList} named with the given key.

If the key does not exist or its value is not a list - * tag, then an empty tag list will be returned.

- * - * @param key the key - * @return a tag list instance - */ - public ListTag getListTag(String key) { - Tag tag = this.value.get(key); - if (tag instanceof ListTag) { - return (ListTag) tag; - } else { - return new ListTag(key, StringTag.class, Collections.emptyList()); - } - } - - /** - * Get a list of tags named with the given key.

If the key does not exist or its value is not a list tag, - * then an empty list will be returned. If the given key references a list but the list of of a different type, then - * an empty list will also be returned.

- * - * @param key the key - * @param listType the class of the contained type - * @param the type of list - * @return a list of tags - */ - @SuppressWarnings("unchecked") public List getList(String key, - Class listType) { - Tag tag = this.value.get(key); - if (tag instanceof ListTag) { - ListTag listTag = (ListTag) tag; - if (listTag.getType().equals(listType)) { - return (List) listTag.getValue(); - } else { - return Collections.emptyList(); - } - } else { - return Collections.emptyList(); - } - } - - /** - * Get a long named with the given key.

If the key does not exist or its value is not a long tag, then - * {@code 0} will be returned.

- * - * @param key the key - * @return a long - */ - public long getLong(String key) { - Tag tag = this.value.get(key); - if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else { - return 0L; - } - } - - /** - * Get a long named with the given key, even if it's another type of number.

If the key does not exist or - * its value is not a number, then {@code 0} will be returned.

- * - * @param key the key - * @return a long - */ - public long asLong(String key) { - Tag tag = this.value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().longValue(); - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().longValue(); - } else { - return 0L; - } - } - - /** - * Get a short named with the given key.

If the key does not exist or its value is not a short tag, then - * {@code 0} will be returned.

- * - * @param key the key - * @return a short - */ - public short getShort(String key) { - Tag tag = this.value.get(key); - if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get a string named with the given key.

If the key does not exist or its value is not a string tag, then - * {@code ""} will be returned.

- * - * @param key the key - * @return a string - */ - public String getString(String key) { - Tag tag = this.value.get(key); - if (tag instanceof StringTag) { - return ((StringTag) tag).getValue(); - } else { - return ""; - } - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - StringBuilder bldr = new StringBuilder(); - bldr.append("TAG_Compound").append(append).append(": ").append(this.value.size()) - .append(" entries\r\n{\r\n"); - for (Map.Entry entry : this.value.entrySet()) { - bldr.append(" ").append(entry.getValue().toString().replaceAll("\r\n", "\r\n ")) - .append("\r\n"); - } - bldr.append("}"); - return bldr.toString(); - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/CompoundTagBuilder.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/CompoundTagBuilder.java deleted file mode 100644 index 7d31a5a99..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/CompoundTagBuilder.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import java.util.HashMap; -import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Helps create compound tags. - */ -public class CompoundTagBuilder { - - private final Map entries; - - /** - * Create a new instance. - */ - CompoundTagBuilder() { - this.entries = new HashMap<>(); - } - - /** - * Create a new instance and use the given map (which will be modified). - * - * @param value the value - */ - CompoundTagBuilder(Map value) { - checkNotNull(value); - this.entries = value; - } - - /** - * Create a new builder instance. - * - * @return a new builder - */ - public static CompoundTagBuilder create() { - return new CompoundTagBuilder(); - } - - /** - * Put the given key and tag into the compound tag. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder put(String key, Tag value) { - checkNotNull(key); - checkNotNull(value); - this.entries.put(key, value); - return this; - } - - /** - * Put the given key and value into the compound tag as a {@code ByteArrayTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putByteArray(String key, byte[] value) { - return put(key, new ByteArrayTag(key, value)); - } - - /** - * Put the given key and value into the compound tag as a {@code ByteTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putByte(String key, byte value) { - return put(key, new ByteTag(key, value)); - } - - /** - * Put the given key and value into the compound tag as a {@code DoubleTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putDouble(String key, double value) { - return put(key, new DoubleTag(key, value)); - } - - /** - * Put the given key and value into the compound tag as a {@code FloatTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putFloat(String key, float value) { - return put(key, new FloatTag(key, value)); - } - - /** - * Put the given key and value into the compound tag as a {@code IntArrayTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putIntArray(String key, int[] value) { - return put(key, new IntArrayTag(key, value)); - } - - /** - * Put the given key and value into the compound tag as an {@code IntTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putInt(String key, int value) { - return put(key, new IntTag(key, value)); - } - - /** - * Put the given key and value into the compound tag as a {@code LongTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putLong(String key, long value) { - return put(key, new LongTag(key, value)); - } - - /** - * Put the given key and value into the compound tag as a {@code ShortTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putShort(String key, short value) { - return put(key, new ShortTag(key, value)); - } - - /** - * Put the given key and value into the compound tag as a {@code StringTag}. - * - * @param key they key - * @param value the value - * @return this object - */ - public CompoundTagBuilder putString(String key, String value) { - return put(key, new StringTag(key, value)); - } - - /** - * Put all the entries from the given map into this map. - * - * @param value the map of tags - * @return this object - */ - public CompoundTagBuilder putAll(Map value) { - checkNotNull(value); - for (Map.Entry entry : value.entrySet()) { - put(entry.getKey(), entry.getValue()); - } - return this; - } - - /** - * Build an unnamed compound tag with this builder's entries. - * - * @return the new compound tag - */ - public CompoundTag build() { - return new CompoundTag(new HashMap(this.entries)); - } - - /** - * Build a new compound tag with this builder's entries. - * - * @param name the name of the tag - * @return the created compound tag - */ - public CompoundTag build(String name) { - return new CompoundTag(name, new HashMap(this.entries)); - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/DoubleTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/DoubleTag.java deleted file mode 100644 index b084f9481..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/DoubleTag.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * The {@code TAG_Double} tag. - */ -public final class DoubleTag extends Tag { - - private final double value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public DoubleTag(double value) { - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public DoubleTag(String name, double value) { - super(name); - this.value = value; - } - - @Override public Double getValue() { - return this.value; - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_Double" + append + ": " + this.value; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/EndTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/EndTag.java deleted file mode 100644 index ce0978fb6..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/EndTag.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * The {@code TAG_End} tag. - */ -public final class EndTag extends Tag { - - /** - * Creates the tag. - */ - public EndTag() { - } - - @Override public Object getValue() { - return null; - } - - @Override public String toString() { - return "TAG_End"; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/FloatTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/FloatTag.java deleted file mode 100644 index 2f7b9f39b..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/FloatTag.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * The {@code TAG_Float} tag. - */ -public final class FloatTag extends Tag { - - private final float value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public FloatTag(float value) { - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public FloatTag(String name, float value) { - super(name); - this.value = value; - } - - @Override public Float getValue() { - return this.value; - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_Float" + append + ": " + this.value; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/IntArrayTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/IntArrayTag.java deleted file mode 100644 index 46ddddacd..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/IntArrayTag.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * The {@code TAG_Int_Array} tag. - */ -public final class IntArrayTag extends Tag { - - private final int[] value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public IntArrayTag(int[] value) { - checkNotNull(value); - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public IntArrayTag(String name, int[] value) { - super(name); - checkNotNull(value); - this.value = value; - } - - @Override public int[] getValue() { - return this.value; - } - - @Override public String toString() { - StringBuilder hex = new StringBuilder(); - for (int b : this.value) { - String hexDigits = Integer.toHexString(b).toUpperCase(); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_Int_Array" + append + ": " + hex; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/IntTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/IntTag.java deleted file mode 100644 index 8bd052dc6..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/IntTag.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * The {@code TAG_Int} tag. - */ -public final class IntTag extends Tag { - - private final int value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public IntTag(int value) { - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public IntTag(String name, int value) { - super(name); - this.value = value; - } - - @Override public Integer getValue() { - return this.value; - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_Int" + append + ": " + this.value; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ListTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ListTag.java deleted file mode 100644 index bf15607f3..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ListTag.java +++ /dev/null @@ -1,375 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import java.util.Collections; -import java.util.List; -import java.util.NoSuchElementException; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * The {@code TAG_List} tag. - */ -public final class ListTag extends Tag { - - private final Class type; - private final List value; - - /** - * Creates the tag with an empty name. - * - * @param type the type of tag - * @param value the value of the tag - */ - public ListTag(Class type, List value) { - checkNotNull(value); - this.type = type; - this.value = Collections.unmodifiableList(value); - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param type the type of tag - * @param value the value of the tag - */ - public ListTag(String name, Class type, List value) { - super(name); - checkNotNull(value); - this.type = type; - this.value = Collections.unmodifiableList(value); - } - - /** - * Gets the type of item in this list. - * - * @return The type of item in this list. - */ - public Class getType() { - return this.type; - } - - @Override public List getValue() { - return this.value; - } - - /** - * Create a new list tag with this tag's name and type. - * - * @param list the new list - * @return a new list tag - */ - public ListTag setValue(List list) { - return new ListTag(getName(), getType(), list); - } - - /** - * Get the tag if it exists at the given index. - * - * @param index the index - * @return the tag or null - */ - public Tag getIfExists(int index) { - try { - return this.value.get(index); - } catch (NoSuchElementException ignored) { - return null; - } - } - - /** - * Get a byte array named with the given index.

If the index does not exist or its value is not a byte - * array tag, then an empty byte array will be returned.

- * - * @param index the index - * @return a byte array - */ - public byte[] getByteArray(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteArrayTag) { - return ((ByteArrayTag) tag).getValue(); - } else { - return new byte[0]; - } - } - - /** - * Get a byte named with the given index.

If the index does not exist or its value is not a byte tag, then - * {@code 0} will be returned.

- * - * @param index the index - * @return a byte - */ - public byte getByte(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else { - return (byte) 0; - } - } - - /** - * Get a double named with the given index.

If the index does not exist or its value is not a double tag, - * then {@code 0} will be returned.

- * - * @param index the index - * @return a double - */ - public double getDouble(int index) { - Tag tag = getIfExists(index); - if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get a double named with the given index, even if it's another type of number.

If the index does not - * exist or its value is not a number, then {@code 0} will be returned.

- * - * @param index the index - * @return a double - */ - public double asDouble(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get a float named with the given index.

If the index does not exist or its value is not a float tag, - * then {@code 0} will be returned.

- * - * @param index the index - * @return a float - */ - public float getFloat(int index) { - Tag tag = getIfExists(index); - if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get a {@code int[]} named with the given index.

If the index does not exist or its value is not an int - * array tag, then an empty array will be returned.

- * - * @param index the index - * @return an int array - */ - public int[] getIntArray(int index) { - Tag tag = getIfExists(index); - if (tag instanceof IntArrayTag) { - return ((IntArrayTag) tag).getValue(); - } else { - return new int[0]; - } - } - - /** - * Get an int named with the given index.

If the index does not exist or its value is not an int tag, then - * {@code 0} will be returned.

- * - * @param index the index - * @return an int - */ - public int getInt(int index) { - Tag tag = getIfExists(index); - if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get an int named with the given index, even if it's another type of number.

If the index does not exist - * or its value is not a number, then {@code 0} will be returned.

- * - * @param index the index - * @return an int - */ - public int asInt(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue().intValue(); - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().intValue(); - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().intValue(); - } else { - return 0; - } - } - - /** - * Get a list of tags named with the given index.

If the index does not exist or its value is not a list - * tag, then an empty list will be returned.

- * - * @param index the index - * @return a list of tags - */ - public List getList(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - return ((ListTag) tag).getValue(); - } else { - return Collections.emptyList(); - } - } - - /** - * Get a {@code TagList} named with the given index.

If the index does not exist or its value is not a list - * tag, then an empty tag list will be returned.

- * - * @param index the index - * @return a tag list instance - */ - public ListTag getListTag(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - return (ListTag) tag; - } else { - return new ListTag(StringTag.class, Collections.emptyList()); - } - } - - /** - * Get a list of tags named with the given index.

If the index does not exist or its value is not a list - * tag, then an empty list will be returned. If the given index references a list but the list of of a different - * type, then an empty list will also be returned.

- * - * @param index the index - * @param listType the class of the contained type - * @param the NBT type - * @return a list of tags - */ - @SuppressWarnings("unchecked") public List getList(int index, - Class listType) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - ListTag listTag = (ListTag) tag; - if (listTag.getType().equals(listType)) { - return (List) listTag.getValue(); - } else { - return Collections.emptyList(); - } - } else { - return Collections.emptyList(); - } - } - - /** - * Get a long named with the given index.

If the index does not exist or its value is not a long tag, then - * {@code 0} will be returned.

- * - * @param index the index - * @return a long - */ - public long getLong(int index) { - Tag tag = getIfExists(index); - if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else { - return 0L; - } - } - - /** - * Get a long named with the given index, even if it's another type of number.

If the index does not exist - * or its value is not a number, then {@code 0} will be returned.

- * - * @param index the index - * @return a long - */ - public long asLong(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().longValue(); - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().longValue(); - } else { - return 0; - } - } - - /** - * Get a short named with the given index.

If the index does not exist or its value is not a short tag, - * then {@code 0} will be returned.

- * - * @param index the index - * @return a short - */ - public short getShort(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else { - return 0; - } - } - - /** - * Get a string named with the given index.

If the index does not exist or its value is not a string tag, - * then {@code ""} will be returned.

- * - * @param index the index - * @return a string - */ - public String getString(int index) { - Tag tag = getIfExists(index); - if (tag instanceof StringTag) { - return ((StringTag) tag).getValue(); - } else { - return ""; - } - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - StringBuilder bldr = new StringBuilder(); - bldr.append("TAG_List").append(append).append(": ").append(this.value.size()) - .append(" entries of type ").append(NBTUtils.getTypeName(this.type)) - .append("\r\n{\r\n"); - for (Tag t : this.value) { - bldr.append(" ").append(t.toString().replaceAll("\r\n", "\r\n ")).append("\r\n"); - } - bldr.append("}"); - return bldr.toString(); - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ListTagBuilder.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ListTagBuilder.java deleted file mode 100644 index 60c2485af..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ListTagBuilder.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Helps create list tags. - */ -public class ListTagBuilder { - - private final Class type; - private final List entries; - - /** - * Create a new instance. - * - * @param type of tag contained in this list - */ - ListTagBuilder(Class type) { - checkNotNull(type); - this.type = type; - this.entries = new ArrayList<>(); - } - - /** - * Create a new builder instance. - * - * @param type - * @return a new builder - */ - public static ListTagBuilder create(Class type) { - return new ListTagBuilder(type); - } - - /** - * Create a new builder instance. - * - * @param entries - * @param - * @return a new builder - */ - @SafeVarargs public static ListTagBuilder createWith(T... entries) { - checkNotNull(entries); - if (entries.length == 0) { - throw new IllegalArgumentException("This method needs an array of at least one entry"); - } - Class type = entries[0].getClass(); - for (int i = 1; i < entries.length; i++) { - if (!type.isInstance(entries[i])) { - throw new IllegalArgumentException("An array of different tag types was provided"); - } - } - ListTagBuilder builder = new ListTagBuilder(type); - builder.addAll(Arrays.asList(entries)); - return builder; - } - - /** - * Add the given tag. - * - * @param value the tag - * @return this object - */ - public ListTagBuilder add(Tag value) { - checkNotNull(value); - if (!this.type.isInstance(value)) { - throw new IllegalArgumentException( - value.getClass().getCanonicalName() + " is not of expected type " + this.type - .getCanonicalName()); - } - this.entries.add(value); - return this; - } - - /** - * Add all the tags in the given list. - * - * @param value a list of tags - * @return this object - */ - public ListTagBuilder addAll(Collection value) { - checkNotNull(value); - for (Tag v : value) { - add(v); - } - return this; - } - - /** - * Build an unnamed list tag with this builder's entries. - * - * @return the new list tag - */ - public ListTag build() { - return new ListTag(this.type, new ArrayList(this.entries)); - } - - /** - * Build a new list tag with this builder's entries. - * - * @param name the name of the tag - * @return the created list tag - */ - public ListTag build(String name) { - return new ListTag(name, this.type, new ArrayList(this.entries)); - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/LongTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/LongTag.java deleted file mode 100644 index 27f5b1cab..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/LongTag.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * The {@code TAG_Long} tag. - */ -public final class LongTag extends Tag { - - private final long value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public LongTag(long value) { - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public LongTag(String name, long value) { - super(name); - this.value = value; - } - - @Override public Long getValue() { - return this.value; - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_Long" + append + ": " + this.value; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTConstants.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTConstants.java deleted file mode 100644 index 9bdd4307b..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTConstants.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -/** - * A class which holds constant values. - */ -public final class NBTConstants { - - public static final Charset CHARSET = StandardCharsets.UTF_8; - public static final int TYPE_END = 0, TYPE_BYTE = 1, TYPE_SHORT = 2, TYPE_INT = 3, TYPE_LONG = - 4, TYPE_FLOAT = 5, TYPE_DOUBLE = 6, TYPE_BYTE_ARRAY = 7, TYPE_STRING = 8, TYPE_LIST = 9, - TYPE_COMPOUND = 10, TYPE_INT_ARRAY = 11; - - /** - * Default private constructor. - */ - private NBTConstants() { - } - - /** - * Convert a type ID to its corresponding {@link Tag} class. - * - * @param id type ID - * @return tag class - * @throws IllegalArgumentException thrown if the tag ID is not valid - */ - public static Class getClassFromType(int id) { - switch (id) { - case TYPE_END: - return EndTag.class; - case TYPE_BYTE: - return ByteTag.class; - case TYPE_SHORT: - return ShortTag.class; - case TYPE_INT: - return IntTag.class; - case TYPE_LONG: - return LongTag.class; - case TYPE_FLOAT: - return FloatTag.class; - case TYPE_DOUBLE: - return DoubleTag.class; - case TYPE_BYTE_ARRAY: - return ByteArrayTag.class; - case TYPE_STRING: - return StringTag.class; - case TYPE_LIST: - return ListTag.class; - case TYPE_COMPOUND: - return CompoundTag.class; - case TYPE_INT_ARRAY: - return IntArrayTag.class; - default: - throw new IllegalArgumentException("Unknown tag type ID of " + id); - } - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTInputStream.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTInputStream.java deleted file mode 100644 index 5a031d182..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTInputStream.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import java.io.Closeable; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * This class reads NBT, or Named Binary Tag streams, and produces an object graph of - * subclasses of the {@code Tag} object. The NBT format was created by Markus Persson, and the specification - * may be found at @linktourl http://www.minecraft.net/docs/NBT.txt"> http://www.minecraft.net/docs/NBT.txt. - */ -public final class NBTInputStream implements Closeable { - - private final DataInputStream is; - - private int count; - - /** - * Creates a new {@code NBTInputStream}, which will source its data from the specified input stream. - * - * @param is the input stream - * @throws IOException if an I/O error occurs - */ - public NBTInputStream(InputStream is) { - this.is = new DataInputStream(is); - } - - /** - * Reads an NBT tag from the stream. - * - * @return The tag that was read. - * @throws IOException if an I/O error occurs. - */ - public Tag readTag() throws IOException { - return readTag(0, Integer.MAX_VALUE); - } - - /** - * Reads an NBT tag from the stream. - * - * @return The tag that was read. - * @throws IOException if an I/O error occurs. - */ - public Tag readTag(int maxDepth) throws IOException { - return readTag(0, maxDepth); - } - - /** - * Reads an NBT from the stream. - * - * @param depth the depth of this tag - * @return The tag that was read. - * @throws IOException if an I/O error occurs. - */ - private Tag readTag(int depth, int maxDepth) throws IOException { - if (this.count++ > maxDepth) { - throw new IOException("Exceeds max depth: " + this.count); - } - int type = this.is.readByte() & 0xFF; - String name; - if (type != NBTConstants.TYPE_END) { - int nameLength = this.is.readShort() & 0xFFFF; - byte[] nameBytes = new byte[nameLength]; - this.is.readFully(nameBytes); - name = new String(nameBytes, NBTConstants.CHARSET); - } else { - name = ""; - } - return readTagPayload(type, name, depth, maxDepth); - } - - /** - * Reads the payload of a tag, given the name and type. - * - * @param type the type - * @param name the name - * @param depth the depth - * @return the tag - * @throws IOException if an I/O error occurs. - */ - private Tag readTagPayload(int type, String name, int depth, int maxDepth) throws IOException { - if (this.count++ > maxDepth) { - throw new IOException("Exceeds max depth: " + this.count); - } - this.count++; - switch (type) { - case NBTConstants.TYPE_END: - if (depth == 0) { - throw new IOException( - "TAG_End found without a TAG_Compound/TAG_List tag preceding it."); - } else { - return new EndTag(); - } - case NBTConstants.TYPE_BYTE: - return new ByteTag(name, this.is.readByte()); - case NBTConstants.TYPE_SHORT: - return new ShortTag(name, this.is.readShort()); - case NBTConstants.TYPE_INT: - return new IntTag(name, this.is.readInt()); - case NBTConstants.TYPE_LONG: - return new LongTag(name, this.is.readLong()); - case NBTConstants.TYPE_FLOAT: - return new FloatTag(name, this.is.readFloat()); - case NBTConstants.TYPE_DOUBLE: - return new DoubleTag(name, this.is.readDouble()); - case NBTConstants.TYPE_BYTE_ARRAY: - int length = this.is.readInt(); - - // Max depth - if ((this.count += length) > maxDepth) { - throw new IOException("Exceeds max depth: " + this.count); - // - } - - byte[] bytes = new byte[length]; - this.is.readFully(bytes); - return new ByteArrayTag(name, bytes); - case NBTConstants.TYPE_STRING: - length = this.is.readShort(); - - // Max depth - if ((this.count += length) > maxDepth) { - throw new IOException("Exceeds max depth: " + this.count); - // - } - - bytes = new byte[length]; - this.is.readFully(bytes); - return new StringTag(name, new String(bytes, NBTConstants.CHARSET)); - case NBTConstants.TYPE_LIST: - int childType = this.is.readByte(); - length = this.is.readInt(); - - // Max depth - if ((this.count += length) > maxDepth) { - throw new IOException("Exceeds max depth: " + this.count); - // - } - - List tagList = new ArrayList(); - for (int i = 0; i < length; ++i) { - Tag tag = readTagPayload(childType, "", depth + 1, maxDepth); - if (tag instanceof EndTag) { - throw new IOException("TAG_End not permitted in a list."); - } - tagList.add(tag); - } - return new ListTag(name, NBTUtils.getTypeClass(childType), tagList); - case NBTConstants.TYPE_COMPOUND: - Map tagMap = new HashMap(); - while (true) { - Tag tag = readTag(depth + 1, maxDepth); - if (tag instanceof EndTag) { - break; - } else { - tagMap.put(tag.getName(), tag); - } - } - return new CompoundTag(name, tagMap); - case NBTConstants.TYPE_INT_ARRAY: - length = this.is.readInt(); - // Max depth - if ((this.count += length) > maxDepth) { - throw new IOException("Exceeds max depth: " + this.count); - } - // - int[] data = new int[length]; - for (int i = 0; i < length; i++) { - data[i] = this.is.readInt(); - } - return new IntArrayTag(name, data); - default: - throw new IOException("Invalid tag type: " + type + '.'); - } - } - - @Override public void close() throws IOException { - this.is.close(); - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTOutputStream.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTOutputStream.java deleted file mode 100644 index d4e1815f9..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTOutputStream.java +++ /dev/null @@ -1,249 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import java.io.Closeable; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.List; - -/** - * This class writes NBT, or Named Binary Tag - * {@code Tag} objects to an underlying {@code OutputStream}. - *

- *

The NBT format was created by Markus Persson, and the specification may - * be found at @linktourl http://www.minecraft.net/docs/NBT.txt - *

- * - * @author Graham Edgecombe - */ -public final class NBTOutputStream implements Closeable { - - /** - * The output stream. - */ - private final DataOutputStream os; - - /** - * Creates a new {@code NBTOutputStream}, which will write data to the - * specified underlying output stream. - * - * @param os The output stream. - * @throws IOException if an I/O error occurs. - */ - public NBTOutputStream(OutputStream os) { - this.os = new DataOutputStream(os); - } - - /** - * Writes a tag. - * - * @param tag The tag to write. - * @throws IOException if an I/O error occurs. - */ - public void writeTag(Tag tag) throws IOException { - int type = NBTUtils.getTypeCode(tag.getClass()); - String name = tag.getName(); - byte[] nameBytes = name.getBytes(NBTConstants.CHARSET); - this.os.writeByte(type); - this.os.writeShort(nameBytes.length); - this.os.write(nameBytes); - if (type == NBTConstants.TYPE_END) { - throw new IOException("Named TAG_End not permitted."); - } - writeTagPayload(tag); - } - - /** - * Writes tag payload. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeTagPayload(Tag tag) throws IOException { - int type = NBTUtils.getTypeCode(tag.getClass()); - switch (type) { - case NBTConstants.TYPE_END: - writeEndTagPayload((EndTag) tag); - break; - case NBTConstants.TYPE_BYTE: - writeByteTagPayload((ByteTag) tag); - break; - case NBTConstants.TYPE_SHORT: - writeShortTagPayload((ShortTag) tag); - break; - case NBTConstants.TYPE_INT: - writeIntTagPayload((IntTag) tag); - break; - case NBTConstants.TYPE_LONG: - writeLongTagPayload((LongTag) tag); - break; - case NBTConstants.TYPE_FLOAT: - writeFloatTagPayload((FloatTag) tag); - break; - case NBTConstants.TYPE_DOUBLE: - writeDoubleTagPayload((DoubleTag) tag); - break; - case NBTConstants.TYPE_BYTE_ARRAY: - writeByteArrayTagPayload((ByteArrayTag) tag); - break; - case NBTConstants.TYPE_STRING: - writeStringTagPayload((StringTag) tag); - break; - case NBTConstants.TYPE_LIST: - writeListTagPayload((ListTag) tag); - break; - case NBTConstants.TYPE_COMPOUND: - writeCompoundTagPayload((CompoundTag) tag); - break; - case NBTConstants.TYPE_INT_ARRAY: - writeIntArrayTagPayload((IntArrayTag) tag); - break; - default: - throw new IOException("Invalid tag type: " + type + '.'); - } - } - - /** - * Writes a {@code TAG_Byte} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeByteTagPayload(ByteTag tag) throws IOException { - this.os.writeByte(tag.getValue()); - } - - /** - * Writes a {@code TAG_Byte_Array} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeByteArrayTagPayload(ByteArrayTag tag) throws IOException { - byte[] bytes = tag.getValue(); - this.os.writeInt(bytes.length); - this.os.write(bytes); - } - - /** - * Writes a {@code TAG_Compound} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeCompoundTagPayload(CompoundTag tag) throws IOException { - for (Tag childTag : tag.getValue().values()) { - writeTag(childTag); - } - this.os.writeByte((byte) 0); // end tag - better way? - } - - /** - * Writes a {@code TAG_List} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeListTagPayload(ListTag tag) throws IOException { - Class clazz = tag.getType(); - List tags = tag.getValue(); - int size = tags.size(); - this.os.writeByte(NBTUtils.getTypeCode(clazz)); - this.os.writeInt(size); - for (Tag tag1 : tags) { - writeTagPayload(tag1); - } - } - - /** - * Writes a {@code TAG_String} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeStringTagPayload(StringTag tag) throws IOException { - byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET); - this.os.writeShort(bytes.length); - this.os.write(bytes); - } - - /** - * Writes a {@code TAG_Double} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeDoubleTagPayload(DoubleTag tag) throws IOException { - this.os.writeDouble(tag.getValue()); - } - - /** - * Writes a {@code TAG_Float} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeFloatTagPayload(FloatTag tag) throws IOException { - this.os.writeFloat(tag.getValue()); - } - - /** - * Writes a {@code TAG_Long} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeLongTagPayload(LongTag tag) throws IOException { - this.os.writeLong(tag.getValue()); - } - - /** - * Writes a {@code TAG_Int} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeIntTagPayload(IntTag tag) throws IOException { - this.os.writeInt(tag.getValue()); - } - - /** - * Writes a {@code TAG_Short} tag. - * - * @param tag The tag. - * @throws IOException if an I/O error occurs. - */ - private void writeShortTagPayload(ShortTag tag) throws IOException { - this.os.writeShort(tag.getValue()); - } - - /** - * Writes a {@code TAG_Empty} tag. - * - * @param tag The tag. - */ - private void writeEndTagPayload(EndTag tag) { - /* empty */ - } - - private void writeIntArrayTagPayload(IntArrayTag tag) throws IOException { - int[] data = tag.getValue(); - this.os.writeInt(data.length); - for (int element : data) { - this.os.writeInt(element); - } - } - - @Override public void close() throws IOException { - this.os.close(); - } - - /** - * Flush output. - * - * @throws IOException - */ - public void flush() throws IOException { - this.os.flush(); - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTUtils.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTUtils.java deleted file mode 100644 index 39ee8d76d..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/NBTUtils.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import java.util.Map; - -/** - * A class which contains NBT-related utility methods. - */ -public final class NBTUtils { - - /** - * Default private constructor. - */ - private NBTUtils() { - } - - /** - * Gets the type name of a tag. - * - * @param clazz the tag class - * @return The type name. - */ - public static String getTypeName(Class clazz) { - if (clazz.equals(ByteArrayTag.class)) { - return "TAG_Byte_Array"; - } else if (clazz.equals(ByteTag.class)) { - return "TAG_Byte"; - } else if (clazz.equals(CompoundTag.class)) { - return "TAG_Compound"; - } else if (clazz.equals(DoubleTag.class)) { - return "TAG_Double"; - } else if (clazz.equals(EndTag.class)) { - return "TAG_End"; - } else if (clazz.equals(FloatTag.class)) { - return "TAG_Float"; - } else if (clazz.equals(IntTag.class)) { - return "TAG_Int"; - } else if (clazz.equals(ListTag.class)) { - return "TAG_List"; - } else if (clazz.equals(LongTag.class)) { - return "TAG_Long"; - } else if (clazz.equals(ShortTag.class)) { - return "TAG_Short"; - } else if (clazz.equals(StringTag.class)) { - return "TAG_String"; - } else if (clazz.equals(IntArrayTag.class)) { - return "TAG_Int_Array"; - } else { - throw new IllegalArgumentException("Invalid tag class (" + clazz.getName() + ")."); - } - } - - /** - * Gets the type code of a tag class. - * - * @param clazz the tag class - * @return The type code. - * @throws IllegalArgumentException if the tag class is invalid. - */ - public static int getTypeCode(Class clazz) { - if (clazz.equals(ByteArrayTag.class)) { - return NBTConstants.TYPE_BYTE_ARRAY; - } else if (clazz.equals(ByteTag.class)) { - return NBTConstants.TYPE_BYTE; - } else if (clazz.equals(CompoundTag.class)) { - return NBTConstants.TYPE_COMPOUND; - } else if (clazz.equals(DoubleTag.class)) { - return NBTConstants.TYPE_DOUBLE; - } else if (clazz.equals(EndTag.class)) { - return NBTConstants.TYPE_END; - } else if (clazz.equals(FloatTag.class)) { - return NBTConstants.TYPE_FLOAT; - } else if (clazz.equals(IntTag.class)) { - return NBTConstants.TYPE_INT; - } else if (clazz.equals(ListTag.class)) { - return NBTConstants.TYPE_LIST; - } else if (clazz.equals(LongTag.class)) { - return NBTConstants.TYPE_LONG; - } else if (clazz.equals(ShortTag.class)) { - return NBTConstants.TYPE_SHORT; - } else if (clazz.equals(StringTag.class)) { - return NBTConstants.TYPE_STRING; - } else if (clazz.equals(IntArrayTag.class)) { - return NBTConstants.TYPE_INT_ARRAY; - } else { - throw new IllegalArgumentException("Invalid tag class (" + clazz.getName() + ")."); - } - } - - /** - * Gets the class of a type of tag. - * - * @param type the type - * @return The class. - * @throws IllegalArgumentException if the tag type is invalid. - */ - public static Class getTypeClass(int type) { - switch (type) { - case NBTConstants.TYPE_END: - return EndTag.class; - case NBTConstants.TYPE_BYTE: - return ByteTag.class; - case NBTConstants.TYPE_SHORT: - return ShortTag.class; - case NBTConstants.TYPE_INT: - return IntTag.class; - case NBTConstants.TYPE_LONG: - return LongTag.class; - case NBTConstants.TYPE_FLOAT: - return FloatTag.class; - case NBTConstants.TYPE_DOUBLE: - return DoubleTag.class; - case NBTConstants.TYPE_BYTE_ARRAY: - return ByteArrayTag.class; - case NBTConstants.TYPE_STRING: - return StringTag.class; - case NBTConstants.TYPE_LIST: - return ListTag.class; - case NBTConstants.TYPE_COMPOUND: - return CompoundTag.class; - case NBTConstants.TYPE_INT_ARRAY: - return IntArrayTag.class; - default: - throw new IllegalArgumentException("Invalid tag type : " + type + "."); - } - } - - /** - * Get child tag of a NBT structure. - * - * @param items the map to read from - * @param key the key to look for - * @param expected the expected NBT class type - * @param - * @return child tag - */ - public static T getChildTag(Map items, String key, - Class expected) throws IllegalArgumentException { - if (!items.containsKey(key)) { - throw new IllegalArgumentException("Missing a \"" + key + "\" tag"); - } - Tag tag = items.get(key); - if (!expected.isInstance(tag)) { - throw new IllegalArgumentException( - key + " tag is not of tag type " + expected.getName()); - } - return expected.cast(tag); - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ShortTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ShortTag.java deleted file mode 100644 index 00fe4a55e..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/ShortTag.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * The {@code TAG_Short} tag. - */ -public final class ShortTag extends Tag { - - private final short value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public ShortTag(short value) { - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public ShortTag(String name, short value) { - super(name); - this.value = value; - } - - @Override public Short getValue() { - return this.value; - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_Short" + append + ": " + this.value; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/StringTag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/StringTag.java deleted file mode 100644 index af0833d5d..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/StringTag.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * The {@code TAG_String} tag. - */ -public final class StringTag extends Tag { - - private final String value; - - /** - * Creates the tag with an empty name. - * - * @param value the value of the tag - */ - public StringTag(String value) { - checkNotNull(value); - this.value = value; - } - - /** - * Creates the tag. - * - * @param name the name of the tag - * @param value the value of the tag - */ - public StringTag(String name, String value) { - super(name); - checkNotNull(value); - this.value = value; - } - - @Override public String getValue() { - return this.value; - } - - @Override public String toString() { - String name = getName(); - String append = ""; - if (name != null && !name.isEmpty()) { - append = "(\"" + getName() + "\")"; - } - return "TAG_String" + append + ": " + this.value; - } -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/Tag.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/Tag.java deleted file mode 100644 index aff875142..000000000 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/jnbt/Tag.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.github.intellectualsites.plotsquared.jnbt; - -/** - * Represents a NBT tag. - */ -public abstract class Tag { - - private final String name; - - /** - * Create a new tag with an empty name. - */ - Tag() { - this(""); - } - - /** - * Creates the tag with the specified name. - * - * @param name the name - */ - Tag(String name) { - if (name == null) { - name = ""; - } - this.name = name; - } - - /** - * Gets the name of this tag. - * - * @return the name of this tag - */ - public final String getName() { - return this.name; - } - - /** - * Gets the value of this tag. - * - * @return the value - */ - public abstract Object getValue(); -} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/PlotSquared.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/PlotSquared.java index e131fd5c8..27c6fc41e 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/PlotSquared.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/PlotSquared.java @@ -1939,7 +1939,7 @@ import java.util.zip.ZipInputStream; * * @param alias to search plots * @param worldname to filter alias to a specific world [optional] null means all worlds - * @return Set<{ @ link Plot }> empty if nothing found + * @return Set<{ @ link Plot }> empty if nothing found */ public Set getPlotsByAlias(@Nullable final String alias, @NonNull final String worldname) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Download.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Download.java index bf9b42aed..11e338720 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Download.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Download.java @@ -1,7 +1,6 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; -import com.github.intellectualsites.plotsquared.jnbt.CompoundTag; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.C; import com.github.intellectualsites.plotsquared.plot.config.Settings; @@ -10,6 +9,7 @@ import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; import com.github.intellectualsites.plotsquared.plot.util.*; +import com.sk89q.jnbt.CompoundTag; import java.net.URL; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Load.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Load.java index fab9eaf95..34353c77f 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Load.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Load.java @@ -5,6 +5,7 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.C; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.object.*; +import com.github.intellectualsites.plotsquared.plot.object.schematic.Schematic; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; @@ -70,8 +71,7 @@ public class Load extends SubCommand { MainUtil.sendMessage(player, C.GENERATING_COMPONENT); TaskManager.runTaskAsync(new Runnable() { @Override public void run() { - SchematicHandler.Schematic schematic = - SchematicHandler.manager.getSchematic(url); + Schematic schematic = SchematicHandler.manager.getSchematic(url); if (schematic == null) { plot.removeRunning(); sendMessage(player, C.SCHEMATIC_INVALID, diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Save.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Save.java index 9f7dc6d27..b4722772e 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Save.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Save.java @@ -1,7 +1,6 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; -import com.github.intellectualsites.plotsquared.jnbt.CompoundTag; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.C; import com.github.intellectualsites.plotsquared.plot.object.*; @@ -9,6 +8,7 @@ import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; import com.github.intellectualsites.plotsquared.plot.util.TaskManager; +import com.sk89q.jnbt.CompoundTag; import java.net.URL; import java.util.List; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/SchematicCmd.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/SchematicCmd.java index 4c5b406f1..6e2852ac6 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/SchematicCmd.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/SchematicCmd.java @@ -5,8 +5,8 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.C; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.object.*; +import com.github.intellectualsites.plotsquared.plot.object.schematic.Schematic; import com.github.intellectualsites.plotsquared.plot.util.*; -import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler.Schematic; import java.net.URL; import java.util.ArrayList; @@ -57,7 +57,7 @@ public class SchematicCmd extends SubCommand { this.running = true; TaskManager.runTaskAsync(new Runnable() { @Override public void run() { - Schematic schematic; + Schematic schematic = null; if (location.startsWith("url:")) { try { UUID uuid = UUID.fromString(location.substring(4)); @@ -72,7 +72,11 @@ public class SchematicCmd extends SubCommand { return; } } else { - schematic = SchematicHandler.manager.getSchematic(location); + try { + schematic = SchematicHandler.manager.getSchematic(location); + } catch (SchematicHandler.UnsupportedFormatException e) { + e.printStackTrace(); + } } if (schematic == null) { SchematicCmd.this.running = false; @@ -212,9 +216,11 @@ public class SchematicCmd extends SubCommand { MainUtil.sendMessage(player, C.NO_PERMISSION, C.PERMISSION_SCHEMATIC_LIST); return false; } - final String string = StringMan.join(SchematicHandler.manager.getShematicNames(), "$2, $1"); + final String string = + StringMan.join(SchematicHandler.manager.getShematicNames(), "$2, $1"); C.SCHEMATIC_LIST.send(player, string); - } break; + } + break; default: sendMessage(player, C.SCHEMATIC_MISSING_ARG); break; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/config/C.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/config/C.java index 517678835..bada78ad2 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/config/C.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/config/C.java @@ -31,8 +31,7 @@ public enum C { "static.flags"), FLAG_PLAYER_INTERACT("player-interact", "static.flags"), FLAG_TAMED_INTERACT("tamed-interact", "static.flags"), FLAG_DISABLE_PHYSICS("disable-physics", "static.flags"), FLAG_MOB_PLACE( - "mob-place", "static.flags"), - /* + "mob-place", "static.flags"), /* * Static permission */ PERMISSION_STAR("*", "static.permissions"), PERMISSION_ADMIN("plots.admin", @@ -833,7 +832,9 @@ public enum C { HELP_INFO_ITEM("$1/plot help %category% $3- $2%category_desc%", "Help"), HELP_ITEM( "$1%usage% [%alias%]&- $3- $2%desc%&-", "Help"), - BUCKET_ENTRIES_IGNORED("$2Total bucket values add up to 1 or more. Blocks without a spcified chance will be ignored", "Generator_Bucket"), + BUCKET_ENTRIES_IGNORED( + "$2Total bucket values add up to 1 or more. Blocks without a spcified chance will be ignored", + "Generator_Bucket"), /* * Direction @@ -1047,4 +1048,5 @@ public enum C { } else { caller.sendMessage(msg); } - }} + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridGen.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridGen.java index e238c0593..e53ad13e5 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridGen.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridGen.java @@ -1,6 +1,5 @@ package com.github.intellectualsites.plotsquared.plot.generator; -import com.github.intellectualsites.plotsquared.jnbt.CompoundTag; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.object.*; import com.github.intellectualsites.plotsquared.plot.util.MathMan; @@ -8,6 +7,7 @@ import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; import com.github.intellectualsites.plotsquared.plot.util.block.ScopedLocalBlockQueue; +import com.sk89q.jnbt.CompoundTag; import java.util.HashMap; import java.util.Map.Entry; @@ -21,7 +21,7 @@ public class HybridGen extends IndependentPlotGenerator { private void placeSchem(HybridPlotWorld world, ScopedLocalBlockQueue result, short relativeX, short relativeZ, int x, int z) { int minY = Math.min(world.PLOT_HEIGHT, world.ROAD_HEIGHT); - char[] blocks = world.G_SCH.get(MathMan.pair(relativeX, relativeZ)); + String[] blocks = world.G_SCH.get(MathMan.pair(relativeX, relativeZ)); if (blocks != null) { for (int y = 0; y < blocks.length; y++) { PlotBlock block = PlotBlock.get(blocks[y]); @@ -92,7 +92,7 @@ public class HybridGen extends IndependentPlotGenerator { } } // generation - HashMap sch = hpw.G_SCH; + HashMap sch = hpw.G_SCH; for (short x = 0; x < 16; x++) { if (gx[x]) { for (short z = 0; z < 16; z++) { @@ -149,11 +149,9 @@ public class HybridGen extends IndependentPlotGenerator { } else { // plot for (int y = 1; y < hpw.PLOT_HEIGHT; y++) { - result.setBlock(x, y, z, - hpw.MAIN_BLOCK.getBlock()); + result.setBlock(x, y, z, hpw.MAIN_BLOCK.getBlock()); } - result.setBlock(x, hpw.PLOT_HEIGHT, z, - hpw.TOP_BLOCK.getBlock()); + result.setBlock(x, hpw.PLOT_HEIGHT, z, hpw.TOP_BLOCK.getBlock()); if (hpw.PLOT_SCHEMATIC) { placeSchem(hpw, result, rx[x], rz[z], x, z); } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridPlotManager.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridPlotManager.java index 355c1a5a3..4d9d1d8ef 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridPlotManager.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridPlotManager.java @@ -89,7 +89,7 @@ public class HybridPlotManager extends ClassicPlotManager { if (absZ < 0) { absZ += size; } - char[] blocks = hpw.G_SCH.get(MathMan.pair(absX, absZ)); + String[] blocks = hpw.G_SCH.get(MathMan.pair(absX, absZ)); if (blocks != null) { for (int y = 0; y < blocks.length; y++) { PlotBlock block = PlotBlock.get(blocks[y]); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridPlotWorld.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridPlotWorld.java index 2cc9a8bfa..69ace7926 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridPlotWorld.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridPlotWorld.java @@ -1,27 +1,37 @@ package com.github.intellectualsites.plotsquared.plot.generator; import com.github.intellectualsites.plotsquared.configuration.ConfigurationSection; -import com.github.intellectualsites.plotsquared.jnbt.CompoundTag; -import com.github.intellectualsites.plotsquared.jnbt.Tag; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.C; -import com.github.intellectualsites.plotsquared.plot.object.*; +import com.github.intellectualsites.plotsquared.plot.object.Location; +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotArea; +import com.github.intellectualsites.plotsquared.plot.object.PlotId; +import com.github.intellectualsites.plotsquared.plot.object.schematic.Schematic; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.MathMan; -import com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils; import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.CompoundTagBuilder; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; +import com.sk89q.worldedit.internal.helper.MCDirections; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.math.transform.AffineTransform; +import com.sk89q.worldedit.util.Direction; +import com.sk89q.worldedit.world.block.BaseBlock; import java.io.File; import java.util.HashMap; -import java.util.Map; public class HybridPlotWorld extends ClassicPlotWorld { + private static AffineTransform transform = new AffineTransform().rotateY(-90); public boolean ROAD_SCHEMATIC_ENABLED; public boolean PLOT_SCHEMATIC = false; public short PATH_WIDTH_LOWER; public short PATH_WIDTH_UPPER; - public HashMap G_SCH; + public HashMap G_SCH; public HashMap> G_SCH_STATE; private Location SIGN_LOCATION; @@ -46,98 +56,34 @@ public class HybridPlotWorld extends ClassicPlotWorld { // FIXME depends on block ids // Possibly make abstract? - public static byte rotate(short id, byte data) { - switch (id) { - case 162: - case 17: - if (data >= 4 && data < 12) { - if (data >= 8) { - return (byte) (data - 4); - } - return (byte) (data + 4); - } - return data; - case 26: // bed - case 86: // pumpkin - case 91: - case 183: // fence gate - case 184: - case 185: - case 186: - case 187: - case 107: - data = wrap2(data, 0); - data = wrap2(data, 2); - data = wrap2(data, 4); - data = wrap2(data, 6); - return data; - case 53: - case 67: - case 108: - case 109: - case 114: - case 128: - case 134: - case 135: - case 136: - case 156: - case 163: - case 164: - case 180: - case 64: - case 71: - case 193: - case 194: - case 195: - case 196: - case 197: - case 93: - case 94: - case 131: - case 145: - case 149: - case 150: - case 96: - case 167: - data = wrap(data, 0); - data = wrap(data, 4); - data = wrap(data, 8); - data = wrap(data, 12); - return data; - case 28: - case 66: - case 157: - case 27: - data = wrap2(data, 0); - data = wrap2(data, 3); - if (data == 2) { - data = 5; - } else if (data == 5) { - data = 2; - } - return data; + public static BaseBlock rotate(BaseBlock id) { + CompoundTag tag = id.toBaseBlock().getNbtData(); - case 23: - case 29: - case 33: - case 158: - case 54: - case 130: - case 146: - case 61: - case 62: - case 65: - case 68: - case 144: - data = wrap(data, 2); - return data; - case 143: - case 77: - data = wrap(data, 1); - return data; - default: - return data; + if (tag != null) { + // Handle blocks which store their rotation in NBT + if (tag.containsKey("Rot")) { + int rot = tag.asInt("Rot"); + + Direction direction = MCDirections.fromRotation(rot); + + if (direction != null) { + Vector3 vector = transform.apply(direction.toVector()) + .subtract(transform.apply(Vector3.ZERO)).normalize(); + Direction newDirection = Direction.findClosest(vector, + Direction.Flag.CARDINAL | Direction.Flag.ORDINAL + | Direction.Flag.SECONDARY_ORDINAL); + + if (newDirection != null) { + CompoundTagBuilder builder = tag.createBuilder(); + + builder.putByte("Rot", (byte) MCDirections.toRotation(newDirection)); + + return id.toBaseBlock(builder.build()); + } + } + } } + return id; } public Location getSignLocation(Plot plot) { @@ -184,7 +130,7 @@ public class HybridPlotWorld extends ClassicPlotWorld { return ((SquarePlotWorld) plotArea).PLOT_WIDTH == this.PLOT_WIDTH; } - public void setupSchematics() { + public void setupSchematics() throws SchematicHandler.UnsupportedFormatException { this.G_SCH = new HashMap<>(); File schematic1File = MainUtil.getFile(PlotSquared.get().IMP.getDirectory(), "schematics/GEN_ROAD_SCHEMATIC/" + this.worldname + "/sideroad.schematic"); @@ -192,19 +138,15 @@ public class HybridPlotWorld extends ClassicPlotWorld { "schematics/GEN_ROAD_SCHEMATIC/" + this.worldname + "/intersection.schematic"); File schem3File = MainUtil.getFile(PlotSquared.get().IMP.getDirectory(), "schematics/GEN_ROAD_SCHEMATIC/" + this.worldname + "/plot.schematic"); - SchematicHandler.Schematic schematic1 = - SchematicHandler.manager.getSchematic(schematic1File); - SchematicHandler.Schematic schematic2 = - SchematicHandler.manager.getSchematic(schematic2File); - SchematicHandler.Schematic schematic3 = SchematicHandler.manager.getSchematic(schem3File); + Schematic schematic1 = SchematicHandler.manager.getSchematic(schematic1File); + Schematic schematic2 = SchematicHandler.manager.getSchematic(schematic2File); + Schematic schematic3 = SchematicHandler.manager.getSchematic(schem3File); int shift = this.ROAD_WIDTH / 2; int oddshift = (this.ROAD_WIDTH & 1) == 0 ? 0 : 1; int minY = Math.min(PLOT_HEIGHT, ROAD_HEIGHT); if (schematic3 != null) { this.PLOT_SCHEMATIC = true; - short[] ids = schematic3.getIds(); - byte[] datas = schematic3.getDatas(); - SchematicHandler.Dimension d3 = schematic3.getSchematicDimension(); + BlockVector3 d3 = schematic3.getClipboard().getDimensions(); short w3 = (short) d3.getX(); short l3 = (short) d3.getZ(); short h3 = (short) d3.getY(); @@ -225,51 +167,52 @@ public class HybridPlotWorld extends ClassicPlotWorld { } int startY = minY - PLOT_HEIGHT; - for (short x = 0; x < w3; x++) { - for (short z = 0; z < l3; z++) { - for (short y = 0; y < h3; y++) { - int index = (y * w3 * l3) + (z * w3) + x; - short id = ids[index]; - byte data = datas[index]; - if (id != 0) { - addOverlayBlock((short) (x + shift + oddshift + centerShiftX), - (short) (y + startY), (short) (z + shift + oddshift + centerShiftZ), - id, data, false, h3); - } - } - } - } - HashMap items = schematic3.getTiles(); - if (!items.isEmpty()) { - this.G_SCH_STATE = new HashMap<>(); - outer: - for (Map.Entry entry : items.entrySet()) { - BlockLoc loc = entry.getKey(); - short x = (short) (loc.x + shift + oddshift + centerShiftX); - short z = (short) (loc.z + shift + oddshift + centerShiftZ); - short y = (short) (loc.y + this.PLOT_HEIGHT); - int pair = MathMan.pair(x, z); - HashMap existing = this.G_SCH_STATE.get(pair); - if (existing == null) { - existing = new HashMap<>(); - this.G_SCH_STATE.put(pair, existing); - } - existing.put((int) y, entry.getValue()); - CompoundTag tag = entry.getValue(); - Map map = ReflectionUtils.getMap(tag.getValue()); - for (int i = 1; i <= 4; i++) { - String ln = tag.getString("Line" + i); - if (ln == null || ln.length() > 11) - continue outer; - } - SIGN_LOCATION = - new Location(worldname, loc.x + centerShiftX, this.PLOT_HEIGHT + loc.y, - loc.z + centerShiftZ); - ALLOW_SIGNS = true; - continue outer; - } - } + // for (short x = 0; x < w3; x++) { + // for (short z = 0; z < l3; z++) { + // for (short y = 0; y < h3; y++) { + // int index = (y * w3 * l3) + (z * w3) + x; + // short id = ids[index]; + // byte data = datas[index]; + // if (id != 0) { + // addOverlayBlock((short) (x + shift + oddshift + centerShiftX), + // (short) (y + startY), (short) (z + shift + oddshift + centerShiftZ), + // id, data, false, h3); + // } + // } + // } + // } + // HashMap items = schematic3.getTiles(); + // if (!items.isEmpty()) { + // this.G_SCH_STATE = new HashMap<>(); + // outer: + // for (Map.Entry entry : items.entrySet()) { + // BlockLoc loc = entry.getKey(); + // short x = (short) (loc.x + shift + oddshift + centerShiftX); + // short z = (short) (loc.z + shift + oddshift + centerShiftZ); + // short y = (short) (loc.y + this.PLOT_HEIGHT); + // int pair = MathMan.pair(x, z); + // HashMap existing = this.G_SCH_STATE.get(pair); + // if (existing == null) { + // existing = new HashMap<>(); + // this.G_SCH_STATE.put(pair, existing); + // } + // existing.put((int) y, entry.getValue()); + // + // CompoundTag tag = entry.getValue(); + // Map map = ReflectionUtils.getMap(tag.getValue()); + // for (int i = 1; i <= 4; i++) { + // String ln = tag.getString("Line" + i); + // if (ln == null || ln.length() > 11) + // continue outer; + // } + // SIGN_LOCATION = + // new Location(worldname, loc.x + centerShiftX, this.PLOT_HEIGHT + loc.y, + // loc.z + centerShiftZ); + // ALLOW_SIGNS = true; + // continue outer; + // } + // } } if (schematic1 == null || schematic2 == null || this.ROAD_WIDTH == 0) { PlotSquared.debug(C.PREFIX + "&3 - schematic: &7false"); @@ -279,17 +222,14 @@ public class HybridPlotWorld extends ClassicPlotWorld { // Do not populate road if using schematic population // TODO: What? this.ROAD_BLOCK = BlockBucket.empty(); // PlotBlock.getEmptyData(this.ROAD_BLOCK); // PlotBlock.get(this.ROAD_BLOCK.id, (byte) 0); - short[] ids1 = schematic1.getIds(); - byte[] datas1 = schematic1.getDatas(); + BlockArrayClipboard blockArrayClipboard1 = schematic1.getClipboard(); + BlockArrayClipboard blockArrayClipboard2 = schematic2.getClipboard(); - short[] ids2 = schematic2.getIds(); - byte[] datas2 = schematic2.getDatas(); - - SchematicHandler.Dimension d1 = schematic1.getSchematicDimension(); + BlockVector3 d1 = blockArrayClipboard1.getDimensions(); short w1 = (short) d1.getX(); short l1 = (short) d1.getZ(); short h1 = (short) d1.getY(); - SchematicHandler.Dimension d2 = schematic2.getSchematicDimension(); + BlockVector3 d2 = blockArrayClipboard2.getDimensions(); short w2 = (short) d2.getX(); short l2 = (short) d2.getZ(); short h2 = (short) d2.getY(); @@ -297,14 +237,13 @@ public class HybridPlotWorld extends ClassicPlotWorld { for (short x = 0; x < w1; x++) { for (short z = 0; z < l1; z++) { for (short y = 0; y < h1; y++) { - int index = (y * w1 * l1) + (z * w1) + x; - short id = ids1[index]; - byte data = datas1[index]; - if (id != 0) { + BaseBlock id = + blockArrayClipboard1.getFullBlock(BlockVector3.at(x, y, z)).toBaseBlock(); + if (!id.getBlockType().getId().toLowerCase().contains("air")) { addOverlayBlock((short) (x - shift), (short) (y + startY), - (short) (z + shift + oddshift), id, data, false, h1); + (short) (z + shift + oddshift), id, false, h1); addOverlayBlock((short) (z + shift + oddshift), (short) (y + startY), - (short) (x - shift), id, data, true, h1); + (short) (x - shift), id, true, h1); } } } @@ -312,19 +251,17 @@ public class HybridPlotWorld extends ClassicPlotWorld { for (short x = 0; x < w2; x++) { for (short z = 0; z < l2; z++) { for (short y = 0; y < h2; y++) { - int index = (y * w2 * l2) + (z * w2) + x; - short id = ids2[index]; - byte data = datas2[index]; - if (id != 0) { + BaseBlock id = blockArrayClipboard2.getFullBlock(BlockVector3.at(x, y, z)); + if (!id.getBlockType().getId().toLowerCase().contains("air")) { addOverlayBlock((short) (x - shift), (short) (y + startY), - (short) (z - shift), id, data, false, h2); + (short) (z - shift), id, false, h2); } } } } } - public void addOverlayBlock(short x, short y, short z, short id, byte data, boolean rotate, + public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) { if (z < 0) { z += this.SIZE; @@ -337,20 +274,14 @@ public class HybridPlotWorld extends ClassicPlotWorld { x -= this.SIZE; } if (rotate) { - byte newData = rotate(id, data); - if (data != 0 || newData != 0) { - data = newData; - } + id = rotate(id); } int pair = MathMan.pair(x, z); - char[] existing = this.G_SCH.get(pair); + String[] existing = this.G_SCH.get(pair); if (existing == null) { - existing = new char[height]; + existing = new String[height]; this.G_SCH.put(pair, existing); } - if (id == 0) { - data = 1; - } - existing[y] = (char) ((id << 4) + data); + existing[y] = id.getBlockType().getId(); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridUtils.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridUtils.java index 7d102784d..c5a45870f 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridUtils.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridUtils.java @@ -1,6 +1,5 @@ package com.github.intellectualsites.plotsquared.plot.generator; -import com.github.intellectualsites.plotsquared.jnbt.CompoundTag; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.C; import com.github.intellectualsites.plotsquared.plot.flag.FlagManager; @@ -10,6 +9,7 @@ import com.github.intellectualsites.plotsquared.plot.util.*; import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; import com.github.intellectualsites.plotsquared.plot.util.expiry.PlotAnalysis; +import com.sk89q.jnbt.CompoundTag; import java.io.File; import java.util.*; @@ -257,7 +257,11 @@ public abstract class HybridUtils { @Override public void run(CompoundTag value) { SchematicHandler.manager.save(value, dir + "intersection.schematic"); plotworld.ROAD_SCHEMATIC_ENABLED = true; - plotworld.setupSchematics(); + try { + plotworld.setupSchematics(); + } catch (SchematicHandler.UnsupportedFormatException e) { + e.printStackTrace(); + } } }); } @@ -348,7 +352,7 @@ public abstract class HybridUtils { condition = !gx || !gz || !lx || !lz; } if (condition) { - char[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ)); + String[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ)); int minY = Math.min(plotWorld.PLOT_HEIGHT, plotWorld.ROAD_HEIGHT); if (blocks != null) { for (int y = 0; y < blocks.length; y++) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/ProcessedWEExtent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/ProcessedWEExtent.java index 448dd50b8..573fdc265 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/ProcessedWEExtent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/ProcessedWEExtent.java @@ -4,17 +4,19 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.C; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.object.RegionWrapper; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.Vector2D; import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.NullExtent; +import com.sk89q.worldedit.math.BlockVector2; +import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.biome.BaseBiome; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockStateHolder; import java.lang.reflect.Field; import java.util.HashSet; @@ -44,52 +46,59 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { this.parent = parent; } - @Override public BaseBlock getBlock(Vector location) { - if (WEManager.maskContains(this.mask, location.getBlockX(), location.getBlockY(), - location.getBlockZ())) { + @Override public BlockState getBlock(BlockVector3 location) { + if (WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ())) { return super.getBlock(location); } return WEManager.AIR; } - @Override public boolean setBlock(Vector location, BaseBlock block) throws WorldEditException { - int id = block.getType(); + @Override public BaseBlock getFullBlock(BlockVector3 location) { + if (WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ())) { + return super.getFullBlock(location); + } + return WEManager.AIR.toBaseBlock(); + } + + @Override public boolean setBlock(BlockVector3 location, BlockStateHolder block) + throws WorldEditException { + String id = block.getBlockType().getId(); switch (id) { - case 54: - case 130: - case 142: - case 27: - case 137: - case 52: - case 154: - case 84: - case 25: - case 144: - case 138: - case 176: - case 177: - case 63: - case 68: - case 323: - case 117: - case 116: - case 28: - case 66: - case 157: - case 61: - case 62: - case 140: - case 146: - case 149: - case 150: - case 158: - case 23: - case 123: - case 124: - case 29: - case 33: - case 151: - case 178: + case "54": + case "130": + case "142": + case "27": + case "137": + case "52": + case "154": + case "84": + case "25": + case "144": + case "138": + case "176": + case "177": + case "63": + case "68": + case "323": + case "117": + case "116": + case "28": + case "66": + case "157": + case "61": + case "62": + case "140": + case "146": + case "149": + case "150": + case "158": + case "23": + case "123": + case "124": + case "29": + case "33": + case "151": + case "178": if (this.BSblocked) { return false; } @@ -97,11 +106,11 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { if (this.BScount > Settings.Chunk_Processor.MAX_TILES) { this.BSblocked = true; PlotSquared.debug( - C.PREFIX + "&cdetected unsafe WorldEdit: " + location.getBlockX() + "," - + location.getBlockZ()); + C.PREFIX + "&cdetected unsafe WorldEdit: " + location.getX() + "," + + location.getZ()); } - if (WEManager.maskContains(this.mask, location.getBlockX(), location.getBlockY(), - location.getBlockZ())) { + if (WEManager + .maskContains(this.mask, location.getX(), location.getY(), location.getZ())) { if (this.count++ > this.max) { if (this.parent != null) { try { @@ -120,11 +129,8 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { } break; default: - int x = location.getBlockX(); - int y = location.getBlockY(); - int z = location.getBlockZ(); - if (WEManager.maskContains(this.mask, location.getBlockX(), location.getBlockY(), - location.getBlockZ())) { + if (WEManager + .maskContains(this.mask, location.getX(), location.getY(), location.getZ())) { if (this.count++ > this.max) { if (this.parent != null) { try { @@ -139,99 +145,9 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { } return false; } - switch (id) { - case 0: - case 2: - case 4: - case 13: - case 14: - case 15: - case 20: - case 21: - case 22: - case 24: - case 25: - case 30: - case 32: - case 37: - case 39: - case 40: - case 41: - case 42: - case 45: - case 46: - case 47: - case 48: - case 49: - case 51: - case 52: - case 54: - case 55: - case 56: - case 57: - case 58: - case 60: - case 61: - case 62: - case 7: - case 8: - case 9: - case 10: - case 11: - case 73: - case 74: - case 78: - case 79: - case 80: - case 81: - case 82: - case 83: - case 84: - case 85: - case 87: - case 88: - case 101: - case 102: - case 103: - case 110: - case 112: - case 113: - case 117: - case 121: - case 122: - case 123: - case 124: - case 129: - case 133: - case 138: - case 137: - case 140: - case 165: - case 166: - case 169: - case 170: - case 172: - case 173: - case 174: - case 176: - case 177: - case 181: - case 182: - case 188: - case 189: - case 190: - case 191: - case 192: { - super.setBlock(location, block); - } - break; - default: { - super.setBlock(location, block); - } - break; - } - return true; + super.setBlock(location, block); } + return true; } return false; @@ -255,8 +171,8 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { return null; } - @Override public boolean setBiome(Vector2D position, BaseBiome biome) { - return WEManager.maskContains(this.mask, position.getBlockX(), position.getBlockZ()) - && super.setBiome(position, biome); + @Override public boolean setBiome(BlockVector2 position, BaseBiome biome) { + return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super + .setBiome(position, biome); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/WEExtent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/WEExtent.java index 75e831cf4..472853ac8 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/WEExtent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/WEExtent.java @@ -1,16 +1,18 @@ package com.github.intellectualsites.plotsquared.plot.listener; import com.github.intellectualsites.plotsquared.plot.object.RegionWrapper; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.Vector2D; import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.math.BlockVector2; +import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.biome.BaseBiome; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockStateHolder; import java.util.HashSet; @@ -23,9 +25,10 @@ public class WEExtent extends AbstractDelegateExtent { this.mask = mask; } - @Override public boolean setBlock(Vector location, BaseBlock block) throws WorldEditException { - return WEManager.maskContains(this.mask, location.getBlockX(), location.getBlockY(), - location.getBlockZ()) && super.setBlock(location, block); + @Override public boolean setBlock(BlockVector3 location, BlockStateHolder block) + throws WorldEditException { + return WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ()) + && super.setBlock(location, block); } @Override public Entity createEntity(Location location, BaseEntity entity) { @@ -36,16 +39,22 @@ public class WEExtent extends AbstractDelegateExtent { return null; } - @Override public boolean setBiome(Vector2D position, BaseBiome biome) { - return WEManager.maskContains(this.mask, position.getBlockX(), position.getBlockZ()) - && super.setBiome(position, biome); + @Override public boolean setBiome(BlockVector2 position, BaseBiome biome) { + return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super + .setBiome(position, biome); } - @Override public BaseBlock getBlock(Vector location) { - if (WEManager.maskContains(this.mask, location.getBlockX(), location.getBlockY(), - location.getBlockZ())) { + @Override public BlockState getBlock(BlockVector3 location) { + if (WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ())) { return super.getBlock(location); } return WEManager.AIR; } + + @Override public BaseBlock getFullBlock(BlockVector3 location) { + if (WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ())) { + return super.getFullBlock(location); + } + return WEManager.AIR.toBaseBlock(); + } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/WEManager.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/WEManager.java index 58ce02bd6..eabb73f47 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/WEManager.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/WEManager.java @@ -4,14 +4,16 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.flag.Flags; import com.github.intellectualsites.plotsquared.plot.object.*; -import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockType; import java.util.HashSet; import java.util.UUID; public class WEManager { - public static BaseBlock AIR = new BaseBlock(0, 0); + + public static BlockState AIR = new BlockType("AIR").getDefaultState(); public static boolean maskContains(HashSet mask, int x, int y, int z) { for (RegionWrapper region : mask) { @@ -31,6 +33,30 @@ public class WEManager { return false; } + public static boolean maskContains(HashSet mask, double dx, double dy, + double dz) { + int x = Math.toIntExact(Math.round(dx >= 0 ? dx - 0.5 : dx + 0.5)); + int y = Math.toIntExact(Math.round(dy - 0.5)); + int z = Math.toIntExact(Math.round(dz >= 0 ? dz - 0.5 : dz + 0.5)); + for (RegionWrapper region : mask) { + if (region.isIn(x, y, z)) { + return true; + } + } + return false; + } + + public static boolean maskContains(HashSet mask, double dx, double dz) { + int x = Math.toIntExact(Math.round(dx >= 0 ? dx - 0.5 : dx + 0.5)); + int z = Math.toIntExact(Math.round(dz >= 0 ? dz - 0.5 : dz + 0.5)); + for (RegionWrapper region : mask) { + if (region.isIn(x, z)) { + return true; + } + } + return false; + } + public static HashSet getMask(PlotPlayer player) { HashSet regions = new HashSet<>(); UUID uuid = player.getUUID(); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Location.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Location.java index ffcf616d1..d787d46e3 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Location.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Location.java @@ -2,15 +2,19 @@ package com.github.intellectualsites.plotsquared.plot.object; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.util.MathMan; +import com.sk89q.worldedit.math.BlockVector3; +import lombok.Getter; +import lombok.Setter; public class Location implements Cloneable, Comparable { - private int x; - private int y; - private int z; - private float yaw; - private float pitch; - private String world; + @Getter private int x; + @Getter private int y; + @Getter private int z; + @Getter @Setter private float yaw; + @Getter @Setter private float pitch; + @Getter @Setter private String world; + @Getter private BlockVector3 blockVector3; public Location(String world, int x, int y, int z, float yaw, float pitch) { this.world = world; @@ -19,6 +23,7 @@ public class Location implements Cloneable, Comparable { this.z = z; this.yaw = yaw; this.pitch = pitch; + this.blockVector3 = BlockVector3.at(x, y, z); } public Location() { @@ -29,40 +34,30 @@ public class Location implements Cloneable, Comparable { this(world, x, y, z, 0f, 0f); } - @Override public Location clone() { - return new Location(this.world, this.x, this.y, this.z, this.yaw, this.pitch); - } - - public int getX() { - return this.x; - } - public void setX(int x) { this.x = x; - } - - public int getY() { - return this.y; + this.blockVector3 = BlockVector3.at(x, y, z); } public void setY(int y) { this.y = y; - } - - public int getZ() { - return this.z; + this.blockVector3 = BlockVector3.at(x, y, z); } public void setZ(int z) { this.z = z; + this.blockVector3 = BlockVector3.at(x, y, z); } - public String getWorld() { - return this.world; + public void setBlockVector3(BlockVector3 blockVector3) { + this.blockVector3 = blockVector3; + this.x = blockVector3.getX(); + this.y = blockVector3.getY(); + this.z = blockVector3.getZ(); } - public void setWorld(String world) { - this.world = world; + @Override public Location clone() { + return new Location(this.world, this.x, this.y, this.z, this.yaw, this.pitch); } public PlotArea getPlotArea() { @@ -132,22 +127,6 @@ public class Location implements Cloneable, Comparable { return new ChunkLoc(this.x >> 4, this.z >> 4); } - public float getYaw() { - return this.yaw; - } - - public void setYaw(float yaw) { - this.yaw = yaw; - } - - public float getPitch() { - return this.pitch; - } - - public void setPitch(float pitch) { - this.pitch = pitch; - } - public Location add(int x, int y, int z) { this.x += x; this.y += y; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Plot.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Plot.java index 0d3721262..eb5e9914a 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Plot.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Plot.java @@ -1,6 +1,5 @@ package com.github.intellectualsites.plotsquared.plot.object; -import com.github.intellectualsites.plotsquared.jnbt.CompoundTag; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.C; import com.github.intellectualsites.plotsquared.plot.config.Configuration; @@ -11,6 +10,7 @@ import com.github.intellectualsites.plotsquared.plot.flag.FlagManager; import com.github.intellectualsites.plotsquared.plot.flag.Flags; import com.github.intellectualsites.plotsquared.plot.generator.SquarePlotWorld; import com.github.intellectualsites.plotsquared.plot.listener.PlotListener; +import com.github.intellectualsites.plotsquared.plot.object.schematic.Schematic; import com.github.intellectualsites.plotsquared.plot.util.*; import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; @@ -19,6 +19,7 @@ import com.github.intellectualsites.plotsquared.plot.util.expiry.PlotAnalysis; import com.google.common.base.Optional; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableSet; +import com.sk89q.jnbt.CompoundTag; import java.awt.geom.Area; import java.awt.geom.PathIterator; @@ -1422,14 +1423,19 @@ public class Plot { } PlotArea plotworld = getArea(); if (plotworld.SCHEMATIC_ON_CLAIM) { - SchematicHandler.Schematic sch; - if (schematic == null || schematic.isEmpty()) { - sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE); - } else { - sch = SchematicHandler.manager.getSchematic(schematic); - if (sch == null) { + Schematic sch = null; + try { + if (schematic == null || schematic.isEmpty()) { sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE); + } else { + sch = SchematicHandler.manager.getSchematic(schematic); + if (sch == null) { + sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE); + } } + } catch (SchematicHandler.UnsupportedFormatException e) { + e.printStackTrace(); + return true; } SchematicHandler.manager.paste(sch, this, 0, 0, 0, true, new RunnableVal() { @Override public void run(Boolean value) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotBlock.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotBlock.java index 27f6023ca..79521908e 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotBlock.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotBlock.java @@ -4,15 +4,20 @@ import com.github.intellectualsites.plotsquared.configuration.serialization.Conf import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.google.common.collect.ImmutableMap; +import com.sk89q.worldedit.world.block.BaseBlock; +import lombok.NonNull; + import java.util.Collection; import java.util.Map; -import lombok.NonNull; public abstract class PlotBlock implements ConfigurationSerializable { private static Class conversionType; private static BlockRegistry blockRegistry; + protected PlotBlock() { + } + public static boolean isEverything(@NonNull final PlotBlock block) { return block.equals(LegacyPlotBlock.EVERYTHING) || block.equals(StringPlotBlock.EVERYTHING); } @@ -26,9 +31,6 @@ public abstract class PlotBlock implements ConfigurationSerializable { return false; } - protected PlotBlock() { - } - public static PlotBlock get(char combinedId) { switch (combinedId) { case 0: @@ -48,27 +50,6 @@ public abstract class PlotBlock implements ConfigurationSerializable { return null; } - @Override public Map serialize() { - return ImmutableMap.of("material", this.getRawId()); - } - - public T to(@NonNull final Class clazz) { - if (blockRegistry == null) { - blockRegistry = PlotSquared.imp().getBlockRegistry(); - if (blockRegistry == null) { - throw new UnsupportedOperationException("The PlotSquared implementation has not registered a custom block registry." - + " This method can't be used."); - } - conversionType = blockRegistry.getType(); - } - if (!clazz.equals(conversionType)) { - throw new UnsupportedOperationException("The PlotSquared implementation has not registered a block registry for this object type"); - } - return clazz.cast(blockRegistry.getItem(this)); - } - - public abstract boolean isAir(); - public static StringPlotBlock get(@NonNull final String itemId) { if (Settings.Enabled_Components.BLOCK_CACHE) { return StringPlotBlock.getOrAdd(itemId); @@ -89,21 +70,52 @@ public abstract class PlotBlock implements ConfigurationSerializable { return get(((LegacyPlotBlock) plotBlock).getId(), (byte) 0); } + public static PlotBlock get(@NonNull final BaseBlock baseBlock) { + StringPlotBlock plotBlock = get(baseBlock.getBlockType().getId()); + plotBlock.setBaseBlock(baseBlock); + return plotBlock; + } + public static PlotBlock get(@NonNull final Object type) { if (blockRegistry == null) { blockRegistry = PlotSquared.imp().getBlockRegistry(); if (blockRegistry == null) { - throw new UnsupportedOperationException("The PlotSquared implementation has not registered a custom block registry." - + " This method can't be used."); + throw new UnsupportedOperationException( + "The PlotSquared implementation has not registered a custom block registry." + + " This method can't be used."); } conversionType = blockRegistry.getType(); } if (!type.getClass().equals(conversionType)) { - throw new UnsupportedOperationException("The PlotSquared implementation has not registered a block registry for this object type"); + throw new UnsupportedOperationException( + "The PlotSquared implementation has not registered a block registry for this object type"); } return blockRegistry.getPlotBlock(type); } + @Override public Map serialize() { + return ImmutableMap.of("material", this.getRawId()); + } + + public T to(@NonNull final Class clazz) { + if (blockRegistry == null) { + blockRegistry = PlotSquared.imp().getBlockRegistry(); + if (blockRegistry == null) { + throw new UnsupportedOperationException( + "The PlotSquared implementation has not registered a custom block registry." + + " This method can't be used."); + } + conversionType = blockRegistry.getType(); + } + if (!clazz.equals(conversionType)) { + throw new UnsupportedOperationException( + "The PlotSquared implementation has not registered a block registry for this object type"); + } + return clazz.cast(blockRegistry.getItem(this)); + } + + public abstract boolean isAir(); + public final boolean equalsAny(final int id, @NonNull final String stringId) { if (this instanceof StringPlotBlock) { final StringPlotBlock stringPlotBlock = (StringPlotBlock) this; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/StringPlotBlock.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/StringPlotBlock.java index 72ce3eeae..2703dc6f1 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/StringPlotBlock.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/StringPlotBlock.java @@ -1,7 +1,9 @@ package com.github.intellectualsites.plotsquared.plot.object; +import com.sk89q.worldedit.world.block.BaseBlock; import lombok.Getter; import lombok.NonNull; +import lombok.Setter; import java.util.HashMap; import java.util.Locale; @@ -11,25 +13,10 @@ public class StringPlotBlock extends PlotBlock { public static final PlotBlock EVERYTHING = new StringPlotBlock(""); private static final Map STRING_PLOT_BLOCK_CACHE = new HashMap<>(); - - public static StringPlotBlock getOrAdd(@NonNull final String itemId) { - // final String id = itemId.toLowerCase(Locale.ENGLISH); - - StringPlotBlock plotBlock = STRING_PLOT_BLOCK_CACHE.get(itemId); - if (plotBlock == null) { - plotBlock = new StringPlotBlock(itemId); - STRING_PLOT_BLOCK_CACHE.put(itemId, plotBlock); - } - - return plotBlock; - } - - @Getter - private final String nameSpace; - @Getter - private final String itemId; + @Getter private final String nameSpace; + @Getter private final String itemId; + @Getter @Setter private BaseBlock baseBlock = null; private boolean isForeign = false; - public StringPlotBlock(@NonNull final String nameSpace, @NonNull final String itemId) { this.nameSpace = nameSpace.toLowerCase(Locale.ENGLISH); this.itemId = itemId.toLowerCase(Locale.ENGLISH); @@ -51,6 +38,18 @@ public class StringPlotBlock extends PlotBlock { this.determineForeign(); } + public static StringPlotBlock getOrAdd(@NonNull final String itemId) { + // final String id = itemId.toLowerCase(Locale.ENGLISH); + + StringPlotBlock plotBlock = STRING_PLOT_BLOCK_CACHE.get(itemId); + if (plotBlock == null) { + plotBlock = new StringPlotBlock(itemId); + STRING_PLOT_BLOCK_CACHE.put(itemId, plotBlock); + } + + return plotBlock; + } + private void determineForeign() { this.isForeign = !this.nameSpace.equals("minecraft"); } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/schematic/Schematic.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/schematic/Schematic.java new file mode 100644 index 000000000..df20b3300 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/schematic/Schematic.java @@ -0,0 +1,47 @@ +package com.github.intellectualsites.plotsquared.plot.object.schematic; + +import com.sk89q.jnbt.NBTOutputStream; +import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; +import com.sk89q.worldedit.extent.clipboard.io.SpongeSchematicWriter; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.world.block.BaseBlock; +import lombok.Getter; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class Schematic { + // Lossy but fast + @Getter private final BlockArrayClipboard clipboard; + @Getter private Map flags = new HashMap<>(); + + public Schematic(BlockArrayClipboard clip) { + this.clipboard = clip; + } + + public void setFlags(Map flags) { + this.flags = flags == null ? new HashMap<>() : flags; + } + + public boolean setBlock(BlockVector3 position, BaseBlock block) throws WorldEditException { + if (clipboard.getRegion().contains(position)) { + BlockVector3 v = position.subtract(clipboard.getRegion().getMinimumPoint()); + clipboard.setBlock(v, block); + return true; + } else { + return false; + } + } + + public void save(File file) throws IOException { + SpongeSchematicWriter ssw = + new SpongeSchematicWriter(new NBTOutputStream(new FileOutputStream(file))); + ssw.write(clipboard); + ssw.close(); + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/schematic/StoredEntity.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/schematic/StoredEntity.java new file mode 100644 index 000000000..a19404da2 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/schematic/StoredEntity.java @@ -0,0 +1,54 @@ +package com.github.intellectualsites.plotsquared.plot.object.schematic; + +import com.sk89q.worldedit.entity.BaseEntity; +import com.sk89q.worldedit.entity.Entity; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.util.Location; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * An implementation of {@link Entity} that stores a {@link BaseEntity} with it. + * + *

Calls to {@link #getState()} return a clone.

+ */ +abstract class StoredEntity implements Entity { + + private final Location location; + private final BaseEntity entity; + + /** + * Create a new instance. + * + * @param location the location + * @param entity the entity (which will be copied) + */ + StoredEntity(Location location, BaseEntity entity) { + checkNotNull(location); + checkNotNull(entity); + this.location = location; + this.entity = new BaseEntity(entity); + } + + /** + * Get the entity state. This is not a copy. + * + * @return the entity + */ + BaseEntity getEntity() { + return entity; + } + + @Override public BaseEntity getState() { + return new BaseEntity(entity); + } + + @Override public Location getLocation() { + return location; + } + + @Override public Extent getExtent() { + return location.getExtent(); + } + +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/SchematicHandler.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/SchematicHandler.java index a6b841d1d..c6b4c34b6 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/SchematicHandler.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/SchematicHandler.java @@ -1,14 +1,24 @@ package com.github.intellectualsites.plotsquared.plot.util; -import com.github.intellectualsites.plotsquared.jnbt.*; import com.github.intellectualsites.plotsquared.json.JSONArray; import com.github.intellectualsites.plotsquared.json.JSONException; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.flag.Flag; +import com.github.intellectualsites.plotsquared.plot.flag.Flags; import com.github.intellectualsites.plotsquared.plot.generator.ClassicPlotWorld; import com.github.intellectualsites.plotsquared.plot.object.*; +import com.github.intellectualsites.plotsquared.plot.object.schematic.Schematic; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; +import com.sk89q.jnbt.*; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; +import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.MCEditSchematicReader; +import com.sk89q.worldedit.extent.clipboard.io.SpongeSchematicReader; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.world.block.BaseBlock; import java.io.*; import java.net.URL; @@ -45,7 +55,7 @@ public abstract class SchematicHandler { Iterator i = plots.iterator(); final Plot plot = i.next(); i.remove(); - String o = UUIDHandler.getName(plot.owner); + String o = UUIDHandler.getName(plot.guessOwner()); if (o == null) { o = "unknown"; } @@ -108,13 +118,13 @@ public abstract class SchematicHandler { * @return boolean true if succeeded */ public void paste(final Schematic schematic, final Plot plot, final int xOffset, - final int yOffset, final int zOffset, final boolean autoHeight, - final RunnableVal whenDone) { + final int yOffset, final int zOffset, final boolean autoHeight, final Runnable whenDone) { + + EditSession editSession = WorldEdit.getInstance().getEditSessionFactory() + .getEditSession(WorldUtil.IMP.getWeWorld(plot.getWorldName()), -1); + TaskManager.runTask(new Runnable() { @Override public void run() { - if (whenDone != null) { - whenDone.value = false; - } if (schematic == null) { PlotSquared.debug("Schematic == null :|"); TaskManager.runTask(whenDone); @@ -126,13 +136,14 @@ public abstract class SchematicHandler { Map flags = schematic.getFlags(); if (!flags.isEmpty()) { for (Map.Entry entry : flags.entrySet()) { - //plot.setFlag(entry.getKey(), StringTag.class.cast(entry.getValue()).getValue()); + plot.setFlag(Flags.getFlag(entry.getKey()), + StringTag.class.cast(entry.getValue()).getValue()); } } } final LocalBlockQueue queue = plot.getArea().getQueue(false); - Dimension dimension = schematic.getSchematicDimension(); + BlockVector3 dimension = schematic.getClipboard().getDimensions(); final int WIDTH = dimension.getX(); final int LENGTH = dimension.getZ(); final int HEIGHT = dimension.getY(); @@ -149,8 +160,7 @@ public abstract class SchematicHandler { return; } // block type and data arrays - final short[] ids = schematic.ids; - final byte[] datas = schematic.datas; + final BlockArrayClipboard blockArrayClipboard = schematic.getClipboard(); // Calculate the optimal height to paste the schematic at final int y_offset_actual; if (autoHeight) { @@ -173,7 +183,6 @@ public abstract class SchematicHandler { new Location(plot.getWorldName(), region.minX + xOffset, y_offset_actual, region.minZ + zOffset); Location pos2 = pos1.clone().add(WIDTH - 1, HEIGHT - 1, LENGTH - 1); - // TODO switch to ChunkManager.chunkTask(pos1, pos2, task, whenDone, allocate); final int p1x = pos1.getX(); final int p1z = pos1.getZ(); final int p2x = pos2.getX(); @@ -182,14 +191,14 @@ public abstract class SchematicHandler { final int bcz = p1z >> 4; final int tcx = p2x >> 4; final int tcz = p2z >> 4; - final ArrayList chunks = new ArrayList(); + final ArrayList chunks = new ArrayList<>(); for (int x = bcx; x <= tcx; x++) { for (int z = bcz; z <= tcz; z++) { chunks.add(new ChunkLoc(x, z)); } } - TaskManager.runTaskAsync(new Runnable() { - @Override public void run() { + ChunkManager.chunkTask(pos1, pos2, new RunnableVal() { + @Override public void run(int[] value) { int count = 0; while (!chunks.isEmpty() && count < 256) { count++; @@ -226,82 +235,9 @@ public abstract class SchematicHandler { int i = i2 + rx; int xx = p1x + rx; int zz = p1z + rz; - int id = ids[i]; - switch (id) { - case 0: - case 2: - case 4: - case 13: - case 14: - case 15: - case 20: - case 21: - case 22: - case 30: - case 32: - case 37: - case 39: - case 40: - case 41: - case 42: - case 45: - case 46: - case 47: - case 48: - case 49: - case 51: - case 55: - case 56: - case 57: - case 58: - case 60: - case 7: - case 8: - case 9: - case 10: - case 11: - case 73: - case 74: - case 78: - case 79: - case 80: - case 81: - case 82: - case 83: - case 85: - case 87: - case 88: - case 101: - case 102: - case 103: - case 110: - case 112: - case 113: - case 121: - case 122: - case 129: - case 133: - case 165: - case 166: - case 169: - case 170: - case 172: - case 173: - case 174: - case 181: - case 182: - case 188: - case 189: - case 190: - case 191: - case 192: - queue.setBlock(xx, yy, zz, id); - break; - default: - queue.setBlock(xx, yy, zz, - PlotBlock.get((short) id, datas[i])); - break; - } + BaseBlock id = blockArrayClipboard + .getFullBlock(BlockVector3.at(rx, ry, rz)); + queue.setBlock(xx, yy, zz, id); } } } @@ -310,7 +246,7 @@ public abstract class SchematicHandler { this.run(); } else { queue.flush(); - HashMap tiles = schematic.getTiles(); + /*HashMap tiles = schematic.getClipboard().getTiles(); if (!tiles.isEmpty()) { TaskManager.IMP.sync(new RunnableVal() { @Override public void run(Object value) { @@ -323,14 +259,10 @@ public abstract class SchematicHandler { } } }); - } - if (whenDone != null) { - whenDone.value = true; - whenDone.run(); - } + }*/ } } - }); + }, whenDone, 10); } catch (Exception e) { e.printStackTrace(); TaskManager.runTask(whenDone); @@ -339,85 +271,6 @@ public abstract class SchematicHandler { }); } - public Schematic getSchematic(CompoundTag tag) { - Map tagMap = tag.getValue(); - byte[] addBlocks = null; - if (tagMap.containsKey("AddBlocks")) { - addBlocks = ByteArrayTag.class.cast(tagMap.get("AddBlocks")).getValue(); - } - - short width = ShortTag.class.cast(tagMap.get("Width")).getValue(); - short length = ShortTag.class.cast(tagMap.get("Length")).getValue(); - short height = ShortTag.class.cast(tagMap.get("Height")).getValue(); - byte[] block_sml = ByteArrayTag.class.cast(tagMap.get("Blocks")).getValue(); - byte[] data = ByteArrayTag.class.cast(tagMap.get("Data")).getValue(); - Map flags; - if (tagMap.containsKey("Flags")) { - flags = CompoundTag.class.cast(tagMap.get("Flags")).getValue(); - } else { - flags = null; - } - - short[] block = new short[block_sml.length]; - for (int i = 0; i < block.length; i++) { - short id = block_sml[i]; - if (id < 0) { - id = (short) (id & 0xFF); - } - block[i] = id; - } - - if (addBlocks != null) { - if (addBlocks.length == block.length) { - for (int i = 0; i < addBlocks.length; i++) { - byte val = addBlocks[i]; - if (val != 0) { - block[i] |= (val << 8); - } - } - } else { - for (int index = 0; index < block.length; index++) { - if ((index & 1) == 0) { - block[index] = - (short) (((addBlocks[index >> 1] & 0x0F) << 8) + (block[index])); - } else { - block[index] = - (short) (((addBlocks[index >> 1] & 0xF0) << 4) + (block[index])); - } - } - } - } - - // Slow as wrapper for each block - // final DataCollection[] collection = new DataCollection[b.length]; - // for (int x = 0; x < b.length; x++) { - // collection[x] = new DataCollection(blocks[x], d[x]); - // } - // Schematic schem = new Schematic(collection, dimension, file); - - Dimension dimensions = new Dimension(width, height, length); - Schematic schem = new Schematic(block, data, dimensions, flags); - // Slow - try { - List blockStates = ListTag.class.cast(tagMap.get("TileEntities")).getValue(); - for (Tag stateTag : blockStates) { - try { - CompoundTag ct = (CompoundTag) stateTag; - Map state = ct.getValue(); - short x = IntTag.class.cast(state.get("x")).getValue().shortValue(); - short y = IntTag.class.cast(state.get("y")).getValue().shortValue(); - short z = IntTag.class.cast(state.get("z")).getValue().shortValue(); - schem.addTile(new BlockLoc(x, y, z), ct); - } catch (Exception e) { - e.printStackTrace(); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return schem; - } - public abstract boolean restoreTile(LocalBlockQueue queue, CompoundTag tag, int x, int y, int z); @@ -427,7 +280,7 @@ public abstract class SchematicHandler { * @param name to check * @return schematic if found, else null */ - public Schematic getSchematic(String name) { + public Schematic getSchematic(String name) throws UnsupportedFormatException { File parent = MainUtil.getFile(PlotSquared.get().IMP.getDirectory(), Settings.Paths.SCHEMATICS); if (!parent.exists()) { @@ -436,7 +289,7 @@ public abstract class SchematicHandler { } } File file = MainUtil.getFile(PlotSquared.get().IMP.getDirectory(), - Settings.Paths.SCHEMATICS + File.separator + name + (name.endsWith(".schematic") ? + Settings.Paths.SCHEMATICS + File.separator + name + (name.endsWith(".schem") ? "" : ".schematic")); return getSchematic(file); @@ -448,12 +301,14 @@ public abstract class SchematicHandler { * @return Immutable collection with schematic names */ public Collection getShematicNames() { - final File parent = MainUtil.getFile(PlotSquared.get().IMP.getDirectory(), Settings.Paths.SCHEMATICS); + final File parent = + MainUtil.getFile(PlotSquared.get().IMP.getDirectory(), Settings.Paths.SCHEMATICS); final List names = new ArrayList<>(); if (parent.exists()) { final String[] rawNames = parent.list((dir, name) -> name.endsWith(".schematic")); if (rawNames != null) { - final List transformed = Arrays.stream(rawNames).map(rawName -> rawName.substring(0, rawName.length() - 10)) + final List transformed = Arrays.stream(rawNames) + .map(rawName -> rawName.substring(0, rawName.length() - 10)) .collect(Collectors.toList()); names.addAll(transformed); } @@ -467,13 +322,26 @@ public abstract class SchematicHandler { * @param file to check * @return schematic if found, else null */ - public Schematic getSchematic(File file) { + public Schematic getSchematic(File file) throws UnsupportedFormatException { if (!file.exists()) { return null; } try { - return getSchematic(new FileInputStream(file)); - } catch (FileNotFoundException e) { + if (BuiltInClipboardFormat.SPONGE_SCHEMATIC.isFormat(file)) { + SpongeSchematicReader ssr = + new SpongeSchematicReader(new NBTInputStream(new FileInputStream(file))); + BlockArrayClipboard clip = (BlockArrayClipboard) ssr.read(); + return new Schematic(clip); + } else if (BuiltInClipboardFormat.MCEDIT_SCHEMATIC.isFormat(file)) { + MCEditSchematicReader msr = + new MCEditSchematicReader(new NBTInputStream(new FileInputStream(file))); + BlockArrayClipboard clip = (BlockArrayClipboard) msr.read(); + return new Schematic(clip); + } else { + throw new UnsupportedFormatException( + "This schematic format is not recognised or supported."); + } + } catch (IOException e) { e.printStackTrace(); } return null; @@ -495,15 +363,21 @@ public abstract class SchematicHandler { return null; } try { - NBTInputStream stream = new NBTInputStream(new GZIPInputStream(is)); - CompoundTag tag = (CompoundTag) stream.readTag(1073741824); - is.close(); - stream.close(); - return getSchematic(tag); - } catch (IOException e) { - e.printStackTrace(); - PlotSquared.debug(is.toString() + " | " + is.getClass().getCanonicalName() - + " is not in GZIP format : " + e.getMessage()); + SpongeSchematicReader ssr = + new SpongeSchematicReader(new NBTInputStream(new GZIPInputStream(is))); + BlockArrayClipboard clip = (BlockArrayClipboard) ssr.read(); + return new Schematic(clip); + } catch (IOException ignored) { + try { + MCEditSchematicReader msr = + new MCEditSchematicReader(new NBTInputStream(new GZIPInputStream(is))); + BlockArrayClipboard clip = (BlockArrayClipboard) msr.read(); + return new Schematic(clip); + } catch (IOException e) { + e.printStackTrace(); + PlotSquared.debug(is.toString() + " | " + is.getClass().getCanonicalName() + + " is not in GZIP format : " + e.getMessage()); + } } return null; } @@ -547,7 +421,7 @@ public abstract class SchematicHandler { try { try (GZIPOutputStream gzip = new GZIPOutputStream(output, true)) { try (NBTOutputStream nos = new NBTOutputStream(gzip)) { - nos.writeTag(tag); + nos.writeNamedTag("Schematic", tag); } } } catch (IOException e) { @@ -574,7 +448,7 @@ public abstract class SchematicHandler { tmp.getParentFile().mkdirs(); try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream(new GZIPOutputStream(stream))) { - output.writeTag(tag); + output.writeNamedTag("Schematic", tag); } } catch (FileNotFoundException e) { e.printStackTrace(); @@ -585,35 +459,6 @@ public abstract class SchematicHandler { return true; } - /** - * Create a compound tag from blocks - * - Untested - * - * @param blocks - * @param blockData - * @param dimension - * @return - */ - public CompoundTag createTag(byte[] blocks, byte[] blockData, Dimension dimension) { - HashMap schematic = new HashMap<>(); - schematic.put("Width", new ShortTag("Width", (short) dimension.getX())); - schematic.put("Length", new ShortTag("Length", (short) dimension.getZ())); - schematic.put("Height", new ShortTag("Height", (short) dimension.getY())); - schematic.put("Materials", new StringTag("Materials", "Alpha")); - schematic.put("WEOriginX", new IntTag("WEOriginX", 0)); - schematic.put("WEOriginY", new IntTag("WEOriginY", 0)); - schematic.put("WEOriginZ", new IntTag("WEOriginZ", 0)); - schematic.put("WEOffsetX", new IntTag("WEOffsetX", 0)); - schematic.put("WEOffsetY", new IntTag("WEOffsetY", 0)); - schematic.put("WEOffsetZ", new IntTag("WEOffsetZ", 0)); - schematic.put("Blocks", new ByteArrayTag("Blocks", blocks)); - schematic.put("Data", new ByteArrayTag("Data", blockData)); - schematic.put("Entities", new ListTag("Entities", CompoundTag.class, new ArrayList())); - schematic.put("TileEntities", - new ListTag("TileEntities", CompoundTag.class, new ArrayList())); - return new CompoundTag("Schematic", schematic); - } - public abstract void getCompoundTag(String world, Set regions, RunnableVal whenDone); @@ -625,9 +470,9 @@ public abstract class SchematicHandler { for (Map.Entry, Object> entry : plot.getFlags().entrySet()) { String key = entry.getKey().getName(); flagMap.put(key, - new StringTag(key, entry.getKey().valueToString(entry.getValue()))); + new StringTag(entry.getKey().valueToString(entry.getValue()))); } - CompoundTag tag = new CompoundTag("Flags", flagMap); + CompoundTag tag = new CompoundTag(flagMap); HashMap map = new HashMap<>(value.getValue()); map.put("Flags", tag); value.setValue(map); @@ -637,160 +482,26 @@ public abstract class SchematicHandler { }); } - /** - * Schematic Dimensions. - */ - public static class Dimension { - - private final int x; - private final int y; - private final int z; - - public Dimension(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - } - - public int getX() { - return this.x; - } - - public int getY() { - return this.y; - } - - public int getZ() { - return this.z; - } - } - - - /** - * Schematic Class - */ - public class Schematic { - // Lossy but fast - private final short[] ids; - private final byte[] datas; - private final Dimension schematicDimension; - private Map flags; - private HashMap tiles; - - public Schematic(short[] i, byte[] b, Dimension d, Map flags) { - this.ids = i; - this.datas = b; - this.schematicDimension = d; - setFlags(flags); - } - - public Map getFlags() { - return this.flags; - } - - public void setFlags(Map flags) { - this.flags = flags == null ? new HashMap() : flags; + public class UnsupportedFormatException extends Exception { + /** + * Throw with a message. + * + * @param message the message + */ + public UnsupportedFormatException(String message) { + super(message); } /** - * Add a tile entity + * Throw with a message and a cause. * - * @param loc - * @param tag + * @param message the message + * @param cause the cause */ - public void addTile(BlockLoc loc, CompoundTag tag) { - if (this.tiles == null) { - this.tiles = new HashMap<>(); - } - this.tiles.put(loc, tag); + public UnsupportedFormatException(String message, Throwable cause) { + super(message, cause); } - /** - * Get the tile entities - * - * @return Map of block location to tag - */ - public HashMap getTiles() { - return this.tiles == null ? new HashMap() : this.tiles; - } - - /** - * Get the schematic dimensions. - * - * @return - */ - public Dimension getSchematicDimension() { - return this.schematicDimension; - } - - /** - * Get the block type array. - * - * @return - */ - public short[] getIds() { - return this.ids; - } - - /** - * Get the block data array. - * - * @return - */ - public byte[] getDatas() { - return this.datas; - } - - public Schematic copySection(RegionWrapper region) { - - int x1 = region.minX; - int x2 = region.maxX; - - int z1 = region.minZ; - int z2 = region.maxZ; - - int y1 = region.minY; - int y2 = Math.min(region.maxY, 255); - - int width = x2 - x1 + 1; - int length = z2 - z1 + 1; - int height = y2 - y1 + 1; - - short[] ids2 = new short[width * length * height]; - byte[] datas2 = new byte[width * length * height]; - - int dx = this.schematicDimension.getX(); - int dy = this.schematicDimension.getY(); - int dz = this.schematicDimension.getZ(); - - for (int y = y1; y <= y2; y++) { - int yy = y >= 0 ? y < dy ? y : y - dy : y + dy; - int i1 = yy * dx * dz; - int j1 = (y - y1) * width * length; - for (int z = z1; z <= z2; z++) { - int zz = z >= 0 ? z < dz ? z : z - dz : z + dz; - int i2 = i1 + zz * dx; - int j2 = j1 + (z - z1) * width; - for (int x = x1; x <= x2; x++) { - int xx = x >= 0 ? x < dx ? x : x - dx : x + dx; - int i3 = i2 + xx; - int j3 = j2 + (x - x1); - ids2[j3] = this.ids[i3]; - datas2[j3] = this.datas[i3]; - } - } - } - return new Schematic(ids2, datas2, new Dimension(width, height, length), null); - } - - public void save(File file) { - byte[] ids2 = new byte[this.ids.length]; - for (int i = 0; i < this.ids.length; i++) { - ids2[i] = (byte) this.ids[i]; - } - CompoundTag tag = createTag(ids2, this.datas, this.schematicDimension); - SchematicHandler.this.save(tag, file.getAbsolutePath()); - } } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/WorldUtil.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/WorldUtil.java index a322348fa..bb376f431 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/WorldUtil.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/WorldUtil.java @@ -1,9 +1,9 @@ package com.github.intellectualsites.plotsquared.plot.util; -import com.github.intellectualsites.plotsquared.jnbt.*; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.object.*; import com.github.intellectualsites.plotsquared.plot.object.schematic.PlotItem; +import com.sk89q.jnbt.*; import java.io.*; import java.net.URL; @@ -54,6 +54,8 @@ public abstract class WorldUtil { public abstract void setBiomes(String world, RegionWrapper region, String biome); + public abstract com.sk89q.worldedit.world.World getWeWorld(String world); + public void upload(final Plot plot, UUID uuid, String file, RunnableVal whenDone) { if (plot == null) { throw new IllegalArgumentException("Plot may not be null!"); @@ -70,16 +72,17 @@ public abstract class WorldUtil { zos.putNextEntry(ze); try (NBTInputStream nis = new NBTInputStream( new GZIPInputStream(new FileInputStream(dat)))) { - CompoundTag tag = (CompoundTag) nis.readTag(); + CompoundTag tag = (CompoundTag) nis.readNamedTag().getTag(); CompoundTag data = (CompoundTag) tag.getValue().get("Data"); Map map = ReflectionUtils.getMap(data.getValue()); - map.put("SpawnX", new IntTag("SpawnX", home.getX())); - map.put("SpawnY", new IntTag("SpawnY", home.getY())); - map.put("SpawnZ", new IntTag("SpawnZ", home.getZ())); + map.put("SpawnX", new IntTag(home.getX())); + map.put("SpawnY", new IntTag(home.getY())); + map.put("SpawnZ", new IntTag(home.getZ())); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (NBTOutputStream out = new NBTOutputStream( new GZIPOutputStream(baos, true))) { - out.writeTag(tag); + //TODO Find what this should be called + out.writeNamedTag("Schematic????", tag); } zos.write(baos.toByteArray()); } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/BasicLocalBlockQueue.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/BasicLocalBlockQueue.java index 67adb0e1e..98c1dc5c8 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/BasicLocalBlockQueue.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/BasicLocalBlockQueue.java @@ -5,6 +5,7 @@ import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.MathMan; import com.github.intellectualsites.plotsquared.plot.util.TaskManager; +import com.sk89q.worldedit.world.block.BaseBlock; import lombok.NonNull; import java.util.concurrent.ConcurrentHashMap; @@ -85,6 +86,33 @@ public abstract class BasicLocalBlockQueue extends LocalBlockQueue { this.modified = modified; } + @Override public boolean setBlock(int x, int y, int z, BaseBlock id) { + if ((y > 255) || (y < 0)) { + return false; + } + int cx = x >> 4; + int cz = z >> 4; + if (cx != lastX || cz != lastZ) { + lastX = cx; + lastZ = cz; + long pair = (long) (cx) << 32 | (cz) & 0xFFFFFFFFL; + lastWrappedChunk = this.blocks.get(pair); + if (lastWrappedChunk == null) { + lastWrappedChunk = this.getLocalChunk(x >> 4, z >> 4); + lastWrappedChunk.setBlock(x & 15, y, z & 15, id); + LocalChunk previous = this.blocks.put(pair, lastWrappedChunk); + if (previous == null) { + chunks.add(lastWrappedChunk); + return true; + } + this.blocks.put(pair, previous); + lastWrappedChunk = previous; + } + } + lastWrappedChunk.setBlock(x & 15, y, z & 15, id); + return true; + } + @Override public boolean setBlock(int x, int y, int z, String id) { if ((y > 255) || (y < 0)) { return false; @@ -249,6 +277,8 @@ public abstract class BasicLocalBlockQueue extends LocalBlockQueue { } } + public abstract void setBlock(final int x, final int y, final int z, final BaseBlock id); + public abstract void setBlock(final int x, final int y, final int z, final String id); public abstract void setBlock(final int x, final int y, final int z, final int id, @@ -281,11 +311,27 @@ public abstract class BasicLocalBlockQueue extends LocalBlockQueue { blocks = new PlotBlock[16][]; } - @Override public void setBlock(final int x, final int y, final int z, @NonNull final String id) { + @Override + public void setBlock(final int x, final int y, final int z, @NonNull final BaseBlock id) { + this.setInternal(x, y, z, id); + } + + @Override + public void setBlock(final int x, final int y, final int z, @NonNull final String id) { final PlotBlock block = PlotBlock.get(id); this.setInternal(x, y, z, block); } + private void setInternal(final int x, final int y, final int z, final BaseBlock bsh) { + final int i = MainUtil.CACHE_I[y][x][z]; + final int j = MainUtil.CACHE_J[y][x][z]; + PlotBlock[] array = blocks[i]; + if (array == null) { + array = (blocks[i] = new PlotBlock[4096]); + } + array[j] = PlotBlock.get(bsh); + } + private void setInternal(final int x, final int y, final int z, final PlotBlock plotBlock) { final int i = MainUtil.CACHE_I[y][x][z]; final int j = MainUtil.CACHE_J[y][x][z]; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/DelegateLocalBlockQueue.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/DelegateLocalBlockQueue.java index f7da58954..1ed93466b 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/DelegateLocalBlockQueue.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/DelegateLocalBlockQueue.java @@ -1,6 +1,7 @@ package com.github.intellectualsites.plotsquared.plot.util.block; import com.github.intellectualsites.plotsquared.plot.object.PlotBlock; +import com.sk89q.worldedit.world.block.BaseBlock; public class DelegateLocalBlockQueue extends LocalBlockQueue { @@ -57,6 +58,10 @@ public class DelegateLocalBlockQueue extends LocalBlockQueue { } } + @Override public boolean setBlock(int x, int y, int z, BaseBlock id) { + return parent.setBlock(x, y, z, id); + } + @Override public boolean setBlock(int x, int y, int z, String id) { return parent.setBlock(x, y, z, id); } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/LocalBlockQueue.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/LocalBlockQueue.java index 748a985af..66bbde46b 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/LocalBlockQueue.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/LocalBlockQueue.java @@ -1,11 +1,12 @@ package com.github.intellectualsites.plotsquared.plot.util.block; -import com.github.intellectualsites.plotsquared.jnbt.CompoundTag; import com.github.intellectualsites.plotsquared.plot.object.*; import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; import com.github.intellectualsites.plotsquared.plot.util.StringMan; import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; import com.github.intellectualsites.plotsquared.plot.util.WorldUtil; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.world.block.BaseBlock; import lombok.NonNull; import java.util.Map; @@ -46,6 +47,8 @@ public abstract class LocalBlockQueue { public abstract boolean setBlock(final int x, final int y, final int z, final String id); + public abstract boolean setBlock(final int x, final int y, final int z, final BaseBlock id); + public final boolean setBlock(int x, int y, int z, @NonNull final PlotBlock block) { if (block instanceof LegacyPlotBlock) { final LegacyPlotBlock legacyPlotBlock = (LegacyPlotBlock) block; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/OffsetLocalBlockQueue.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/OffsetLocalBlockQueue.java index 7ac49bced..d0a561111 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/OffsetLocalBlockQueue.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/OffsetLocalBlockQueue.java @@ -1,5 +1,7 @@ package com.github.intellectualsites.plotsquared.plot.util.block; +import com.sk89q.worldedit.world.block.BaseBlock; + public class OffsetLocalBlockQueue extends DelegateLocalBlockQueue { private final int ox; private final int oy; @@ -16,7 +18,7 @@ public class OffsetLocalBlockQueue extends DelegateLocalBlockQueue { return super.setBiome(ox + x, oy + y, biome); } - @Override public boolean setBlock(int x, int y, int z, int id, int data) { - return super.setBlock(ox + x, oy + y, oz + z, id, data); + @Override public boolean setBlock(int x, int y, int z, BaseBlock id) { + return super.setBlock(ox + x, oy + y, oz + z, id); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/ScopedLocalBlockQueue.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/ScopedLocalBlockQueue.java index 4e1e90eec..134b29818 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/ScopedLocalBlockQueue.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/block/ScopedLocalBlockQueue.java @@ -2,6 +2,7 @@ package com.github.intellectualsites.plotsquared.plot.util.block; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.object.*; +import com.sk89q.worldedit.world.block.BaseBlock; public class ScopedLocalBlockQueue extends DelegateLocalBlockQueue { private final int minX; @@ -44,9 +45,14 @@ public class ScopedLocalBlockQueue extends DelegateLocalBlockQueue { } } + @Override public boolean setBlock(int x, int y, int z, BaseBlock id) { + return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super + .setBlock(x + minX, y + minY, z + minZ, id); + } + @Override public boolean setBlock(int x, int y, int z, String id) { - return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && - super.setBlock(x + minX, y + minY, z + minZ, id); + return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super + .setBlock(x + minX, y + minY, z + minZ, id); } @Override public boolean setBlock(int x, int y, int z, int id, int data) { diff --git a/build.gradle b/build.gradle index f2c3dea76..03fa6d0eb 100644 --- a/build.gradle +++ b/build.gradle @@ -57,7 +57,7 @@ subprojects { } dependencies { - compile(group: 'com.sk89q.worldedit', name: 'worldedit-core', version: '6.1.3-SNAPSHOT') { + compile(group: 'com.sk89q.worldedit', name: 'worldedit-core', version: '7.0.0-SNAPSHOT') { exclude(module: 'bukkit-classloader-check') exclude(module: 'mockito-core') exclude(module: 'dummypermscompat')