diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/BukkitPlayer.java index 7f97d3a52..8556027f4 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/BukkitPlayer.java @@ -15,12 +15,13 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class BukkitPlayer extends FawePlayer { private static ConsoleCommandSender console; - public BukkitPlayer(final Player parent) { + public BukkitPlayer(@NotNull final Player parent) { super(parent); } diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java index e020b3f71..889f85897 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java @@ -81,7 +81,7 @@ public class FaweBukkit implements IFawe, Listener { return this.vault; } - public FaweBukkit(Plugin plugin) { + public FaweBukkit(WorldEditPlugin plugin) { this.plugin = plugin; try { Settings.IMP.TICK_LIMITER.ENABLED = !Bukkit.hasWhitelist(); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/HeightMapMCAGenerator.java b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/HeightMapMCAGenerator.java index 1ccdcb03f..e49c68a45 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/HeightMapMCAGenerator.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/HeightMapMCAGenerator.java @@ -217,10 +217,10 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr super(width, length, regionFolder); blocks = new DifferentialBlockBuffer(width, length); - heights = new DifferentialArray(new byte[getArea()]); - biomes = new DifferentialArray(new byte[getArea()]); - floor = new DifferentialArray(new int[getArea()]); - main = new DifferentialArray(new int[getArea()]); + heights = new DifferentialArray<>(new byte[getArea()]); + biomes = new DifferentialArray<>(new byte[getArea()]); + floor = new DifferentialArray<>(new int[getArea()]); + main = new DifferentialArray<>(new int[getArea()]); int stone = BlockID.STONE; int grass = BlockTypes.GRASS_BLOCK.getDefaultState().with(PropertyKey.SNOWY, false).getInternalId(); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAChunk.java b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAChunk.java index 4a53e22e2..da10b2073 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAChunk.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAChunk.java @@ -6,7 +6,6 @@ import com.boydti.fawe.object.FaweChunk; import com.boydti.fawe.object.FaweQueue; import com.boydti.fawe.object.io.FastByteArrayOutputStream; import com.boydti.fawe.object.number.MutableLong; -import com.boydti.fawe.util.ArrayUtil; import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.MathMan; import com.boydti.fawe.util.ReflectionUtils; @@ -191,8 +190,8 @@ public class MCAChunk extends FaweChunk { setNibble(endIndex, thisSkyLight, (byte) 0); setNibble(endIndex, thisBlockLight, (byte) 0); } - ArrayUtil.fill(thisSkyLight, startIndexShift, endIndexShift + 1, (byte) 0); - ArrayUtil.fill(thisBlockLight, startIndexShift, endIndexShift + 1, (byte) 0); + Arrays.fill(thisBlockLight, startIndexShift, endIndex + 1, (byte) 0); + Arrays.fill(thisBlockLight, startIndexShift, endIndexShift + 1, (byte) 0); } } continue; @@ -292,8 +291,8 @@ public class MCAChunk extends FaweChunk { if (otherIds == null) { if (currentIds != null) { Arrays.fill(currentIds, indexStart, indexEnd, 0); - ArrayUtil.fill(skyLight[thisLayer], indexStartShift, indexEndShift, (byte) 0); - ArrayUtil.fill(blockLight[thisLayer], indexStartShift, indexEndShift, (byte) 0); + Arrays.fill(skyLight[thisLayer], indexStartShift, indexEndShift, (byte) 0); + Arrays.fill(blockLight[thisLayer], indexStartShift, indexEndShift, (byte) 0); } } else { if (currentIds == null) { @@ -320,8 +319,8 @@ public class MCAChunk extends FaweChunk { continue; } Arrays.fill(thisIds, thisStartIndex, thisStartIndex + 256, 0); - ArrayUtil.fill(this.skyLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0); - ArrayUtil.fill(this.blockLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0); + Arrays.fill(this.skyLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0); + Arrays.fill(this.blockLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0); continue; } else if (thisIds == null) { ids[thisLayer] = thisIds = new int[4096]; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAFile.java b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAFile.java index b274b241c..2d3b75c08 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAFile.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAFile.java @@ -56,24 +56,9 @@ public class MCAFile { private final int X, Z; private final Int2ObjectOpenHashMap chunks = new Int2ObjectOpenHashMap<>(); - final ThreadLocal byteStore1 = new ThreadLocal() { - @Override - protected byte[] initialValue() { - return new byte[4096]; - } - }; - final ThreadLocal byteStore2 = new ThreadLocal() { - @Override - protected byte[] initialValue() { - return new byte[4096]; - } - }; - final ThreadLocal byteStore3 = new ThreadLocal() { - @Override - protected byte[] initialValue() { - return new byte[1024]; - } - }; + final ThreadLocal byteStore1 = ThreadLocal.withInitial(() -> new byte[4096]); + final ThreadLocal byteStore2 = ThreadLocal.withInitial(() -> new byte[4096]); + final ThreadLocal byteStore3 = ThreadLocal.withInitial(() -> new byte[1024]); public MCAFile(FaweQueue parent, File file) { this.queue = parent; @@ -204,9 +189,10 @@ public class MCAFile { if (offset == 0) { return null; } - NBTInputStream nis = getChunkIS(offset); - MCAChunk chunk = new MCAChunk(nis, queue, cx, cz, false); - nis.close(); + MCAChunk chunk; + try (NBTInputStream nis = getChunkIS(offset)) { + chunk = new MCAChunk(nis, queue, cx, cz, false); + } int pair = MathMan.pair((short) (cx & 31), (short) (cz & 31)); synchronized (chunks) { chunks.put(pair, chunk); @@ -347,7 +333,6 @@ public class MCAFile { public void streamChunk(byte[] data, RunnableVal withStream) throws IOException { if (data != null) { try { - FastByteArrayInputStream nbtIn = new FastByteArrayInputStream(data); FastByteArrayInputStream bais = new FastByteArrayInputStream(data); InflaterInputStream iis = new InflaterInputStream(bais, new Inflater(), 1); fieldBuf2.set(iis, byteStore2.get()); @@ -392,8 +377,7 @@ public class MCAFile { return null; } byte[] uncompressed = chunk.toBytes(byteStore3.get()); - byte[] compressed = MainUtil.compress(uncompressed, byteStore2.get(), null); - return compressed; + return MainUtil.compress(uncompressed, byteStore2.get(), null); } private byte[] getChunkBytes(int cx, int cz) throws Exception { @@ -509,24 +493,21 @@ public class MCAFile { modified = true; chunk.setLastUpdate(now); if (!chunk.isDeleted()) { - pool.submit(new Runnable() { - @Override - public void run() { - try { - byte[] compressed = toBytes(chunk); - int pair = MathMan.pair((short) (chunk.getX() & 31), (short) (chunk.getZ() & 31)); - Int2ObjectOpenHashMap map; - if (getOffset(chunk.getX(), chunk.getZ()) == 0) { - map = append; - } else { - map = compressedMap; - } - synchronized (map) { - map.put(pair, compressed); - } - } catch (Throwable e) { - e.printStackTrace(); + pool.submit(() -> { + try { + byte[] compressed = toBytes(chunk); + int pair = MathMan.pair((short) (chunk.getX() & 31), (short) (chunk.getZ() & 31)); + Int2ObjectOpenHashMap map; + if (getOffset(chunk.getX(), chunk.getZ()) == 0) { + map = append; + } else { + map = compressedMap; } + synchronized (map) { + map.put(pair, compressed); + } + } catch (Throwable e) { + e.printStackTrace(); } }); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java index 53255a02b..020cee278 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java @@ -1,7 +1,6 @@ package com.boydti.fawe.jnbt.anvil; import com.boydti.fawe.Fawe; -import com.boydti.fawe.example.IntFaweChunk; import com.boydti.fawe.example.NMSMappedFaweQueue; import com.boydti.fawe.example.NullFaweChunk; import com.boydti.fawe.jnbt.anvil.filters.DelegateMCAFilter; @@ -18,6 +17,7 @@ import com.boydti.fawe.util.MainUtil; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; + import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -25,11 +25,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; -import java.util.Collection; -import java.util.Comparator; -import java.util.Map; -import java.util.Set; -import java.util.UUID; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.TimeUnit; @@ -39,12 +34,7 @@ public class MCAQueue extends NMSMappedFaweQueue blockStore = new ThreadLocal() { - @Override - protected MutableMCABackedBaseBlock initialValue() { - return new MutableMCABackedBaseBlock(); - } - }; + private final ThreadLocal blockStore = ThreadLocal.withInitial(MutableMCABackedBaseBlock::new); @Override protected void finalize() throws Throwable { @@ -124,7 +114,7 @@ public class MCAQueue extends NMSMappedFaweQueue chunk; synchronized (this) { chunk = this.getFaweChunk(otherCX, otherCZ); } @@ -202,7 +192,7 @@ public class MCAQueue extends NMSMappedFaweQueue= regionTo.minX && tx <= regionTo.maxX && bz >= regionTo.minZ && tz <= regionTo.maxZ) { - FaweChunk chunk = from.getFaweChunk(cx - oCX, cz - oCZ); + FaweChunk chunk = from.getFaweChunk(cx - oCX, cz - oCZ); if (!(chunk instanceof NullFaweChunk)) { // if (regionTo.minY == 0 && regionTo.maxY == 255) { // System.out.println("Vertical"); @@ -251,7 +241,7 @@ public class MCAQueue extends NMSMappedFaweQueue chunk = from.getFaweChunk(otherCX, otherCZ); if (!(chunk instanceof NullFaweChunk)) { MCAChunk other = (MCAChunk) chunk; int ocbx = otherCX << 4; @@ -447,7 +437,7 @@ public class MCAQueue extends NMSMappedFaweQueue> 9; final int maxMCAX = region.maxX >> 9; final int maxMCAZ = region.maxZ >> 9; - long mcaArea = (maxMCAX - minMCAX + 1l) * (maxMCAZ - minMCAZ + 1l); + long mcaArea = (maxMCAX - minMCAX + 1L) * (maxMCAZ - minMCAZ + 1L); if (mcaArea < 128) { this.filterWorld(delegate, new RunnableVal2>() { @Override @@ -514,49 +504,46 @@ public class MCAQueue extends NMSMappedFaweQueue() { @Override public void run(final Integer rcx, final Integer rcz, Integer offset, Integer size) { - pool.submit(new Runnable() { - @Override - public void run() { - try { - int cx = cbx + rcx; - int cz = cbz + rcz; - if (filter.appliesChunk(cx, cz)) { - MCAChunk chunk = finalFile.getChunk(cx, cz); - try { - final G value = filter.get(); - chunk = filter.applyChunk(chunk, value); - if (chunk != null) { - final MutableMCABackedBaseBlock mutableBlock = blockStore.get(); - mutableBlock.setChunk(chunk); - int bx = cx << 4; - int bz = cz << 4; - for (int layer = 0; layer < 16; layer++) { - if (chunk.doesSectionExist(layer)) { - mutableBlock.setArrays(layer); - int yStart = layer << 4; - int index = 0; - for (int y = yStart; y < yStart + 16; y++) { - mutableBlock.setY(y); - for (int z = bz; z < bz + 16; z++) { - mutableBlock.setZ(z); - for (int x = bx; x < bx + 16; x++, index++) { - mutableBlock.setX(x); - mutableBlock.setIndex(index); - filter.applyBlock(x, y, z, mutableBlock, value); - } + pool.submit(() -> { + try { + int cx = cbx + rcx; + int cz = cbz + rcz; + if (filter.appliesChunk(cx, cz)) { + MCAChunk chunk = finalFile.getChunk(cx, cz); + try { + final G value = filter.get(); + chunk = filter.applyChunk(chunk, value); + if (chunk != null) { + final MutableMCABackedBaseBlock mutableBlock = blockStore.get(); + mutableBlock.setChunk(chunk); + int bx = cx << 4; + int bz = cz << 4; + for (int layer = 0; layer < 16; layer++) { + if (chunk.doesSectionExist(layer)) { + mutableBlock.setArrays(layer); + int yStart = layer << 4; + int index = 0; + for (int y = yStart; y < yStart + 16; y++) { + mutableBlock.setY(y); + for (int z = bz; z < bz + 16; z++) { + mutableBlock.setZ(z); + for (int x = bx; x < bx + 16; x++, index++) { + mutableBlock.setX(x); + mutableBlock.setIndex(index); + filter.applyBlock(x, y, z, mutableBlock, value); } } } } - filter.finishChunk(chunk, value); } - } catch (Throwable e) { - e.printStackTrace(); + filter.finishChunk(chunk, value); } + } catch (Throwable e) { + e.printStackTrace(); } - } catch (Throwable e) { - e.printStackTrace(); } + } catch (Throwable e) { + e.printStackTrace(); } }); } @@ -568,8 +555,8 @@ public class MCAQueue extends NMSMappedFaweQueue> T filterWorld(final T filter, Comparator comparator) { - return filterWorld(filter, new RunnableVal2>() { - @Override - public void run(Path value1, RunnableVal2 value2) { - MainUtil.forEachFile(value1, value2, comparator); - } - }); - } - @Override public boolean supports(Capability capability) { if (capability == Capability.CHANGE_TASKS) { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/filters/RemoveLayerFilter.java b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/filters/RemoveLayerFilter.java index 164377551..5e0acac44 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/filters/RemoveLayerFilter.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/jnbt/anvil/filters/RemoveLayerFilter.java @@ -3,7 +3,6 @@ package com.boydti.fawe.jnbt.anvil.filters; import com.boydti.fawe.jnbt.anvil.MCAChunk; import com.boydti.fawe.jnbt.anvil.MCAFilterCounter; import com.boydti.fawe.object.number.MutableLong; -import com.boydti.fawe.util.ArrayUtil; import com.sk89q.worldedit.world.block.BlockTypes; import java.util.Arrays; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/DelegateConsumer.java b/worldedit-core/src/main/java/com/boydti/fawe/object/DelegateConsumer.java index 1414df181..f7f41de30 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/DelegateConsumer.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/DelegateConsumer.java @@ -3,9 +3,9 @@ package com.boydti.fawe.object; import java.util.function.Consumer; public abstract class DelegateConsumer implements Consumer { - private final Consumer parent; + private final Consumer parent; - public DelegateConsumer(Consumer parent) { + public DelegateConsumer(Consumer parent) { this.parent = parent; } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/CFIChange.java b/worldedit-core/src/main/java/com/boydti/fawe/object/change/CFIChange.java index a967f090d..9d88d540d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/CFIChange.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/change/CFIChange.java @@ -23,7 +23,7 @@ public class CFIChange implements Change { } private HeightMapMCAGenerator getQueue(UndoContext context) { - ExtentTraverser found = new ExtentTraverser(context.getExtent()).find(HasFaweQueue.class); + ExtentTraverser found = new ExtentTraverser<>(context.getExtent()).find(HasFaweQueue.class); if (found != null) { FaweQueue queue = ((HasFaweQueue) found.get()).getQueue(); if (queue instanceof HeightMapMCAGenerator) return (HeightMapMCAGenerator) queue; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBlockChange.java b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBlockChange.java index ffd05cc19..d44c31b0a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBlockChange.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBlockChange.java @@ -44,7 +44,7 @@ public class MutableBlockChange implements Change { if (!checkedQueue) { checkedQueue = true; Extent extent = context.getExtent(); - ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class); + ExtentTraverser found = new ExtentTraverser<>(extent).find(HasFaweQueue.class); if (found != null) { (queue = ((HasFaweQueue) found.get()).getQueue()).setBlock(x, y, z, combinedId); } else { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableChunkChange.java b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableChunkChange.java index 7216bbfeb..91eee4d4c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableChunkChange.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableChunkChange.java @@ -43,7 +43,7 @@ public class MutableChunkChange implements Change { if (!checkedQueue) { checkedQueue = true; Extent extent = context.getExtent(); - ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class); + ExtentTraverser found = new ExtentTraverser<>(extent).find(HasFaweQueue.class); if (found != null) { perform(queue = ((HasFaweQueue) found.get()).getQueue(), undo); } else { @@ -68,4 +68,4 @@ public class MutableChunkChange implements Change { queue.setChunk(to); } } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableEntityChange.java b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableEntityChange.java index 790338f41..549889eac 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableEntityChange.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableEntityChange.java @@ -48,7 +48,7 @@ public class MutableEntityChange implements Change { public void delete(UndoContext context) { Extent extent = context.getExtent(); - ExtentTraverser find = new ExtentTraverser(extent).find(FastWorldEditExtent.class); + ExtentTraverser find = new ExtentTraverser<>(extent).find(FastWorldEditExtent.class); if (find != null) { FastWorldEditExtent fwee = find.get(); Map map = tag.getValue(); @@ -85,7 +85,7 @@ public class MutableEntityChange implements Change { if (!checkedQueue) { checkedQueue = true; Extent extent = context.getExtent(); - ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class); + ExtentTraverser found = new ExtentTraverser<>(extent).find(HasFaweQueue.class); if (found != null) { perform(queue = ((HasFaweQueue) found.get()).getQueue()); } else { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableFullBlockChange.java b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableFullBlockChange.java index 504af840a..480580590 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableFullBlockChange.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableFullBlockChange.java @@ -51,7 +51,7 @@ public class MutableFullBlockChange implements Change { if (!checkedQueue) { checkedQueue = true; Extent extent = context.getExtent(); - ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class); + ExtentTraverser found = new ExtentTraverser<>(extent).find(HasFaweQueue.class); if (found != null) { perform(queue = ((HasFaweQueue) found.get()).getQueue()); } else { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableTileChange.java b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableTileChange.java index 1fe150abb..7f51eb7c1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableTileChange.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableTileChange.java @@ -47,7 +47,7 @@ public class MutableTileChange implements Change { if (!checkedQueue) { checkedQueue = true; Extent extent = context.getExtent(); - ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class); + ExtentTraverser found = new ExtentTraverser<>(extent).find(HasFaweQueue.class); if (found != null) { perform(queue = ((HasFaweQueue) found.get()).getQueue()); } else { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/DiskStorageHistory.java b/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/DiskStorageHistory.java index 6e18b6839..6872d2509 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/DiskStorageHistory.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/DiskStorageHistory.java @@ -43,10 +43,10 @@ public class DiskStorageHistory extends FaweStreamChangeSet { /* * Block data - * + * * [header] * {int origin x, int origin z} - * + * * [contents]... * { short rel x, short rel z, unsigned byte y, short combinedFrom, short combinedTo } */ @@ -143,10 +143,6 @@ public class DiskStorageHistory extends FaweStreamChangeSet { deleteFiles(); } - public void undo(FawePlayer fp) { - undo(fp, null); - } - public void redo(FawePlayer fp, Region[] regions) { EditSession session = toEditSession(fp, regions); session.redo(session); @@ -523,6 +519,6 @@ public class DiskStorageHistory extends FaweStreamChangeSet { @Override public void setRecordChanges(boolean recordChanges) { // TODO Auto-generated method stub - + } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/MutableAnvilChange.java b/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/MutableAnvilChange.java index d4cca8c3d..c319f7921 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/MutableAnvilChange.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/MutableAnvilChange.java @@ -34,7 +34,7 @@ public class MutableAnvilChange implements Change { if (!checkedQueue) { checkedQueue = true; Extent extent = context.getExtent(); - ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class); + ExtentTraverser found = new ExtentTraverser<>(extent).find(HasFaweQueue.class); if (found != null) { queue = ((HasFaweQueue) found.get()).getQueue(); destDir = queue.getSaveFolder().toPath(); @@ -51,14 +51,11 @@ public class MutableAnvilChange implements Change { Files.move(source, dest, StandardCopyOption.ATOMIC_MOVE); } catch (IOException ignore) { int[] coords = MainUtil.regionNameToCoords(source.toString()); - queue.setMCA(coords[0], coords[1], RegionWrapper.GLOBAL(), new Runnable() { - @Override - public void run() { - try { - Files.move(source, dest, StandardCopyOption.ATOMIC_MOVE); - } catch (IOException e1) { - e1.printStackTrace(); - } + queue.setMCA(coords[0], coords[1], RegionWrapper.GLOBAL(), () -> { + try { + Files.move(source, dest, StandardCopyOption.ATOMIC_MOVE); + } catch (IOException e1) { + e1.printStackTrace(); } }, false, true); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/ObjObjMap.java b/worldedit-core/src/main/java/com/boydti/fawe/object/collection/ObjObjMap.java index 6e97f7a7c..6d639fb35 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/ObjObjMap.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/collection/ObjObjMap.java @@ -5,229 +5,232 @@ import java.util.Arrays; import static it.unimi.dsi.fastutil.HashCommon.arraySize; -public class ObjObjMap -{ +public class ObjObjMap { private static final Object FREE_KEY = new Object(); private static final Object REMOVED_KEY = new Object(); - /** Keys and values */ + /** + * Keys and values + */ private Object[] m_data; - /** Value for the null key (if inserted into a map) */ + /** + * Value for the null key (if inserted into a map) + */ private Object m_nullValue; private boolean m_hasNull; - /** Fill factor, must be between (0 and 1) */ + /** + * Fill factor, must be between (0 and 1) + */ private final float m_fillFactor; - /** We will resize a map once it reaches this size */ + /** + * We will resize a map once it reaches this size + */ private int m_threshold; - /** Current map size */ + /** + * Current map size + */ private int m_size; - /** Mask to calculate the original position */ + /** + * Mask to calculate the original position + */ private int m_mask; - /** Mask to wrap the actual array pointer */ + /** + * Mask to wrap the actual array pointer + */ private int m_mask2; - public ObjObjMap( final int size, final float fillFactor ) - { - if ( fillFactor <= 0 || fillFactor >= 1 ) - throw new IllegalArgumentException( "FillFactor must be in (0, 1)" ); - if ( size <= 0 ) - throw new IllegalArgumentException( "Size must be positive!" ); + public ObjObjMap(final int size, final float fillFactor) { + if (fillFactor <= 0 || fillFactor >= 1) { + throw new IllegalArgumentException("FillFactor must be in (0, 1)"); + } + if (size <= 0) { + throw new IllegalArgumentException("Size must be positive!"); + } final int capacity = arraySize(size, fillFactor); m_mask = capacity - 1; m_mask2 = capacity * 2 - 1; m_fillFactor = fillFactor; m_data = new Object[capacity * 2]; - Arrays.fill( m_data, FREE_KEY ); + Arrays.fill(m_data, FREE_KEY); m_threshold = (int) (capacity * fillFactor); } - public V get( @Nonnull final K key ) - { + public V get(@Nonnull final K key) { // if ( key == null ) // return (V) m_nullValue; //we null it on remove, so safe not to check a flag here int ptr = (key.hashCode() & m_mask) << 1; - Object k = m_data[ ptr ]; + Object k = m_data[ptr]; // if ( k == FREE_KEY ) // return null; //end of chain already - if ( k == ( key ) ) //we check FREE and REMOVED prior to this call - return (V) m_data[ ptr + 1 ]; - while ( true ) + if (k == (key)) //we check FREE and REMOVED prior to this call { + return (V) m_data[ptr + 1]; + } + while (true) { ptr = (ptr + 2) & m_mask2; //that's next index - k = m_data[ ptr ]; + k = m_data[ptr]; // if ( k == FREE_KEY ) // return null; - if ( k == ( key ) ) - return (V) m_data[ ptr + 1 ]; + if (k == (key)) { + return (V) m_data[ptr + 1]; + } } } - public V put( final K key, final V value ) - { - if ( key == null ) + public V put(final K key, final V value) { + if (key == null) { return insertNullKey(value); + } int ptr = getStartIndex(key) << 1; Object k = m_data[ptr]; - if ( k == FREE_KEY ) //end of chain already + if (k == FREE_KEY) //end of chain already { - m_data[ ptr ] = key; - m_data[ ptr + 1 ] = value; - if ( m_size >= m_threshold ) - rehash( m_data.length * 2 ); //size is set inside - else + m_data[ptr] = key; + m_data[ptr + 1] = value; + if (m_size >= m_threshold) { + rehash(m_data.length * 2); //size is set inside + } else { ++m_size; + } return null; - } - else if ( k == ( key ) ) //we check FREE and REMOVED prior to this call + } else if (k == (key)) //we check FREE and REMOVED prior to this call { - final Object ret = m_data[ ptr + 1 ]; - m_data[ ptr + 1 ] = value; + final Object ret = m_data[ptr + 1]; + m_data[ptr + 1] = value; return (V) ret; } int firstRemoved = -1; - if ( k == REMOVED_KEY ) + if (k == REMOVED_KEY) { firstRemoved = ptr; //we may find a key later + } - while ( true ) - { - ptr = ( ptr + 2 ) & m_mask2; //that's next index calculation - k = m_data[ ptr ]; - if ( k == FREE_KEY ) - { - if ( firstRemoved != -1 ) + while (true) { + ptr = (ptr + 2) & m_mask2; //that's next index calculation + k = m_data[ptr]; + if (k == FREE_KEY) { + if (firstRemoved != -1) { ptr = firstRemoved; - m_data[ ptr ] = key; - m_data[ ptr + 1 ] = value; - if ( m_size >= m_threshold ) - rehash( m_data.length * 2 ); //size is set inside - else + } + m_data[ptr] = key; + m_data[ptr + 1] = value; + if (m_size >= m_threshold) { + rehash(m_data.length * 2); //size is set inside + } else { ++m_size; + } return null; - } - else if ( k == ( key ) ) - { - final Object ret = m_data[ ptr + 1 ]; - m_data[ ptr + 1 ] = value; + } else if (k == (key)) { + final Object ret = m_data[ptr + 1]; + m_data[ptr + 1] = value; return (V) ret; - } - else if ( k == REMOVED_KEY ) - { - if ( firstRemoved == -1 ) + } else if (k == REMOVED_KEY) { + if (firstRemoved == -1) { firstRemoved = ptr; + } } } } - public V remove( final K key ) - { - if ( key == null ) + public V remove(final K key) { + if (key == null) { return removeNullKey(); + } int ptr = getStartIndex(key) << 1; - Object k = m_data[ ptr ]; - if ( k == FREE_KEY ) + Object k = m_data[ptr]; + if (k == FREE_KEY) { return null; //end of chain already - else if ( k == ( key ) ) //we check FREE and REMOVED prior to this call + } else if (k == (key)) //we check FREE and REMOVED prior to this call { --m_size; - if ( m_data[ ( ptr + 2 ) & m_mask2 ] == FREE_KEY ) - m_data[ ptr ] = FREE_KEY; - else - m_data[ ptr ] = REMOVED_KEY; - final V ret = (V) m_data[ ptr + 1 ]; - m_data[ ptr + 1 ] = null; + if (m_data[(ptr + 2) & m_mask2] == FREE_KEY) { + m_data[ptr] = FREE_KEY; + } else { + m_data[ptr] = REMOVED_KEY; + } + final V ret = (V) m_data[ptr + 1]; + m_data[ptr + 1] = null; return ret; } - while ( true ) - { - ptr = ( ptr + 2 ) & m_mask2; //that's next index calculation - k = m_data[ ptr ]; - if ( k == FREE_KEY ) + while (true) { + ptr = (ptr + 2) & m_mask2; //that's next index calculation + k = m_data[ptr]; + if (k == FREE_KEY) { return null; - else if ( k == ( key ) ) - { + } else if (k == (key)) { --m_size; - if ( m_data[ ( ptr + 2 ) & m_mask2 ] == FREE_KEY ) - m_data[ ptr ] = FREE_KEY; - else - m_data[ ptr ] = REMOVED_KEY; - final V ret = (V) m_data[ ptr + 1 ]; - m_data[ ptr + 1 ] = null; + if (m_data[(ptr + 2) & m_mask2] == FREE_KEY) { + m_data[ptr] = FREE_KEY; + } else { + m_data[ptr] = REMOVED_KEY; + } + final V ret = (V) m_data[ptr + 1]; + m_data[ptr + 1] = null; return ret; } } } - private V insertNullKey(final V value) - { - if ( m_hasNull ) - { + private V insertNullKey(final V value) { + if (m_hasNull) { final Object ret = m_nullValue; m_nullValue = value; return (V) ret; - } - else - { + } else { m_nullValue = value; ++m_size; return null; } } - private V removeNullKey() - { - if ( m_hasNull ) - { + private V removeNullKey() { + if (m_hasNull) { final Object ret = m_nullValue; m_nullValue = null; m_hasNull = false; --m_size; return (V) ret; - } - else - { + } else { return null; } } - public int size() - { + public int size() { return m_size; } - private void rehash( final int newCapacity ) - { - m_threshold = (int) (newCapacity/2 * m_fillFactor); - m_mask = newCapacity/2 - 1; + private void rehash(final int newCapacity) { + m_threshold = (int) (newCapacity / 2 * m_fillFactor); + m_mask = newCapacity / 2 - 1; m_mask2 = newCapacity - 1; final int oldCapacity = m_data.length; final Object[] oldData = m_data; - m_data = new Object[ newCapacity ]; - Arrays.fill( m_data, FREE_KEY ); + m_data = new Object[newCapacity]; + Arrays.fill(m_data, FREE_KEY); m_size = m_hasNull ? 1 : 0; - for ( int i = 0; i < oldCapacity; i += 2 ) { - final Object oldKey = oldData[ i ]; - if( oldKey != FREE_KEY && oldKey != REMOVED_KEY ) - put( (K)oldKey, (V)oldData[ i + 1 ]); + for (int i = 0; i < oldCapacity; i += 2) { + final Object oldKey = oldData[i]; + if (oldKey != FREE_KEY && oldKey != REMOVED_KEY) { + put((K) oldKey, (V) oldData[i + 1]); + } } } - public int getStartIndex( final Object key ) - { + public int getStartIndex(final Object key) { //key is not null here return key.hashCode() & m_mask; } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedAreaTable.java b/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedAreaTable.java index b3c4d0d5c..df56e4b16 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedAreaTable.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedAreaTable.java @@ -28,10 +28,9 @@ public class SummedAreaTable { public void processSummedAreaTable() { int rowSize = source.length / width; - int colSize = width; int index = 0; for (int i = 0; i < rowSize; i++) { - for (int j = 0; j < colSize; j++, index++) { + for (int j = 0; j < width; j++, index++) { long val = getVal(i, j, index, source[index]); summed[index] = val; } @@ -94,4 +93,4 @@ public class SummedAreaTable { return curr + leftSum + topSum - topLeftSum; } } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiTransform.java b/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiTransform.java index 95b652ecd..475a18a07 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiTransform.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiTransform.java @@ -28,7 +28,7 @@ public class MultiTransform extends RandomTransform { @Override public void add(ResettableExtent extent, double chance) { super.add(extent, chance); - this.extents = getExtents().toArray(new ResettableExtent[getExtents().size()]); + this.extents = getExtents().toArray(new ResettableExtent[0]); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/Fast2DIterator.java b/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/Fast2DIterator.java index 50a53fdef..5c849f57c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/Fast2DIterator.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/Fast2DIterator.java @@ -4,9 +4,7 @@ import com.boydti.fawe.config.Settings; import com.boydti.fawe.example.MappedFaweQueue; import com.boydti.fawe.object.FaweQueue; import com.boydti.fawe.object.HasFaweQueue; -import com.boydti.fawe.util.ExtentTraverser; import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector2; import java.util.Iterator; @@ -22,17 +20,13 @@ public class Fast2DIterator implements Iterable { this(iter, (HasFaweQueue) extent); } - public Fast2DIterator(@Nonnull Iterable iter, @Nullable Extent extent) { - this(iter, (HasFaweQueue) (extent != null ? (extent instanceof HasFaweQueue ? extent : new ExtentTraverser(extent).findAndGet(HasFaweQueue.class)) : null)); - } - public Fast2DIterator(@Nonnull Iterable iter, @Nullable HasFaweQueue editSession) { this(iter, (FaweQueue) (editSession != null ? editSession.getQueue() : null)); } public Fast2DIterator(@Nonnull Iterable iter, @Nullable FaweQueue faweQueue) { this.iterable = iter; - this.queue = faweQueue != null && faweQueue instanceof MappedFaweQueue ? (MappedFaweQueue) faweQueue : null; + this.queue = faweQueue instanceof MappedFaweQueue ? (MappedFaweQueue) faweQueue : null; } public Iterable getIterable() { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/regions/general/plot/PlotTrim.java b/worldedit-core/src/main/java/com/boydti/fawe/regions/general/plot/PlotTrim.java index 2bb7aa619..d0635b76b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/regions/general/plot/PlotTrim.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/regions/general/plot/PlotTrim.java @@ -124,10 +124,7 @@ public class PlotTrim { @Override public boolean appliesFile(int mcaX, int mcaZ) { ChunkLoc loc = new ChunkLoc(mcaX, mcaZ); - if (mcas.contains(loc)) { - return false; - } - return true; + return !mcas.contains(loc); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ArrayUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/ArrayUtil.java deleted file mode 100644 index f5c2f8056..000000000 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ArrayUtil.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.boydti.fawe.util; - -import java.util.Arrays; - -public class ArrayUtil { - public static final void fill(byte[] a, int fromIndex, int toIndex, byte val) { - for (int i = fromIndex; i < toIndex; i++) a[i] = val; - } - - public static final void fill(char[] a, int fromIndex, int toIndex, char val) { - for (int i = fromIndex; i < toIndex; i++) a[i] = val; - } - - public static T[] concatAll(T[] first, T[]... rest) { - int totalLength = first.length; - for (T[] array : rest) { - totalLength += array.length; - } - T[] result = Arrays.copyOf(first, totalLength); - int offset = first.length; - for (T[] array : rest) { - System.arraycopy(array, 0, result, offset, array.length); - offset += array.length; - } - return result; - } -} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/BrushCache.java b/worldedit-core/src/main/java/com/boydti/fawe/util/BrushCache.java index f15bb7ef0..875fc3da1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/BrushCache.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/BrushCache.java @@ -20,6 +20,7 @@ import java.util.WeakHashMap; public final class BrushCache { private static final WeakHashMap brushCache = new WeakHashMap<>(); private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + private static final ThreadLocal RECURSION = new ThreadLocal<>(); private static final CompoundTag getNBT(BaseItem item) { return item.hasNbtData() ? item.getNbtData() : null; @@ -29,21 +30,29 @@ public final class BrushCache { return item.getNativeItem(); } - private static final ThreadLocal RECURSION = new ThreadLocal<>(); - public static final BrushTool getTool(Player player, LocalSession session, BaseItem item) { - if (!item.hasNbtData()) return null; + if (!item.hasNbtData()) { + return null; + } Object key = getKey(item); - if (key == null) return null; + if (key == null) { + return null; + } BrushTool cached = brushCache.get(key); - if (cached != null) return cached; + if (cached != null) { + return cached; + } CompoundTag nbt = item.getNbtData(); - if (nbt == null) return null; + if (nbt == null) { + return null; + } StringTag json = (StringTag) nbt.getValue().get("weBrushJson"); if (json != null) { try { - if (RECURSION.get() != null) return null; + if (RECURSION.get() != null) { + return null; + } RECURSION.set(true); BrushTool tool = BrushTool.fromString(player, session, json.getValue()); @@ -64,12 +73,16 @@ public final class BrushCache { public static BrushTool getCachedTool(BaseItem item) { Object key = getKey(item); - if (key != null) return brushCache.get(key); + if (key != null) { + return brushCache.get(key); + } return null; } public static final BrushTool setTool(BaseItem item, BrushTool tool) { - if (item.getNativeItem() == null) return null; + if (item.getNativeItem() == null) { + return null; + } CompoundTag nbt = item.getNbtData(); Map map; @@ -96,8 +109,12 @@ public final class BrushCache { displayMap.put("Lore", FaweCache.asTag(json.split("\\r?\\n"))); String primary = (String) tool.getPrimary().getSettings().get(BrushSettings.SettingType.BRUSH); String secondary = (String) tool.getSecondary().getSettings().get(BrushSettings.SettingType.BRUSH); - if (primary == null) primary = secondary; - if (secondary == null) secondary = primary; + if (primary == null) { + primary = secondary; + } + if (secondary == null) { + secondary = primary; + } if (primary != null) { String name = primary == secondary ? primary.split(" ")[0] : primary.split(" ")[0] + " / " + secondary.split(" ")[0]; displayMap.put("Name", new StringTag("{\"text\":\"" + name + "\"}")); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/CachedMathMan.java b/worldedit-core/src/main/java/com/boydti/fawe/util/CachedMathMan.java index 0da1cc9cf..b1c2c85bf 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/CachedMathMan.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/CachedMathMan.java @@ -5,29 +5,17 @@ public class CachedMathMan { private static final int ATAN2_BITS2 = ATAN2_BITS << 1; private static final int ATAN2_MASK = ~(-1 << ATAN2_BITS2); private static final int ATAN2_COUNT = ATAN2_MASK + 1; - private static final int ATAN2_DIM = (int) Math.sqrt(ATAN2_COUNT); - private static final float INV_ATAN2_DIM_MINUS_1 = 1.0f / (ATAN2_DIM - 1); - private static final float[] atan2 = new float[ATAN2_COUNT]; - static { - for (int i = 0; i < ATAN2_DIM; i++) { - for (int j = 0; j < ATAN2_DIM; j++) { - float x0 = (float) i / ATAN2_DIM; - float y0 = (float) j / ATAN2_DIM; - - atan2[(j * ATAN2_DIM) + i] = (float) Math.atan2(y0, x0); - } - } - } private static float[] ANGLES = new float[65536]; + private static char[] SQRT = new char[65536]; + static { for (int i = 0; i < 65536; ++i) { ANGLES[i] = (float) Math.sin((double) i * 3.141592653589793D * 2.0D / 65536.0D); } } - private static char[] SQRT = new char[65536]; static { for (int i = 0; i < SQRT.length; i++) { SQRT[i] = (char) Math.round(Math.sqrt(i)); @@ -36,6 +24,7 @@ public class CachedMathMan { /** * Optimized for i elem 0,65536 (characters) + * * @param i * @return square root */ @@ -51,37 +40,4 @@ public class CachedMathMan { return ANGLES[(int) (paramFloat * 10430.378F + 16384.0F) & 0xFFFF]; } - protected static final float atan2(float y, float x) { - float add, mul; - - if (x < 0.0f) { - if (y < 0.0f) { - x = -x; - y = -y; - - mul = 1.0f; - } else { - x = -x; - mul = -1.0f; - } - - add = -3.141592653f; - } else { - if (y < 0.0f) { - y = -y; - mul = -1.0f; - } else { - mul = 1.0f; - } - - add = 0.0f; - } - - float invDiv = 1.0f / ((Math.max(x, y)) * INV_ATAN2_DIM_MINUS_1); - - int xi = (int) (x * invDiv); - int yi = (int) (y * invDiv); - - return (atan2[(yi * ATAN2_DIM) + xi] + add) * mul; - } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/CachedTextureUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/CachedTextureUtil.java index a9ae2f2cb..1c4c959de 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/CachedTextureUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/CachedTextureUtil.java @@ -1,11 +1,8 @@ package com.boydti.fawe.util; -import com.boydti.fawe.FaweCache; - -import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; -import com.sk89q.worldedit.world.block.BlockTypes; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + import java.io.FileNotFoundException; public class CachedTextureUtil extends DelegateTextureUtil { @@ -43,7 +40,7 @@ public class CachedTextureUtil extends DelegateTextureUtil { } BiomeColor result = parent.getNearestBiome(color); if (result != null) { - colorBiomeMap.put((int) color, (Integer) result.id); + colorBiomeMap.put(color, (Integer) result.id); } return result; } @@ -56,7 +53,7 @@ public class CachedTextureUtil extends DelegateTextureUtil { } BlockType result = parent.getNearestBlock(color); if (result != null) { - colorBlockMap.put((int) color, result); + colorBlockMap.put(color, result); } return result; } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/CleanTextureUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/CleanTextureUtil.java index 69de226b7..202832975 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/CleanTextureUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/CleanTextureUtil.java @@ -14,8 +14,12 @@ public class CleanTextureUtil extends TextureUtil { int maxIndex = ((parent.distances.length - 1) * maxPercent) / 100; long min = parent.distances[minIndex]; long max = parent.distances[maxIndex]; - for (; minIndex > 0 && parent.distances[minIndex - 1] == min; minIndex--) ; - for (; maxIndex < parent.distances.length - 1 && parent.distances[maxIndex + 1] == max; maxIndex++) ; + for (; minIndex > 0 && parent.distances[minIndex - 1] == min; minIndex--) { + ; + } + for (; maxIndex < parent.distances.length - 1 && parent.distances[maxIndex + 1] == max; maxIndex++) { + ; + } int num = maxIndex - minIndex + 1; this.validMixBiomeColors = parent.validMixBiomeColors; this.validMixBiomeIds = parent.validMixBiomeIds; @@ -44,4 +48,4 @@ public class CleanTextureUtil extends TextureUtil { public int getMax() { return max; } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ColorUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/ColorUtil.java index 635e8247d..a54f63231 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ColorUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/ColorUtil.java @@ -1,6 +1,6 @@ package com.boydti.fawe.util; -import java.awt.Color; +import java.awt.*; import java.lang.reflect.Field; import java.util.Locale; @@ -17,13 +17,13 @@ public class ColorUtil { throw new IllegalArgumentException("Invalid color specification"); } type = PARSE_PERCENT; - color = color.substring(0, color.length()-1).trim(); + color = color.substring(0, color.length() - 1).trim(); } else if (type == PARSE_PERCENT) { throw new IllegalArgumentException("Invalid color specification"); } float c = ((type == PARSE_COMPONENT) - ? Integer.parseInt(color) - : Float.parseFloat(color)); + ? Integer.parseInt(color) + : Float.parseFloat(color)); switch (type) { case PARSE_ALPHA: return (c < 0f) ? 0f : (Math.min(c, 1f)); @@ -35,39 +35,39 @@ public class ColorUtil { return ((c < 0f) ? ((c % 360f) + 360f) : ((c > 360f) - ? (c % 360f) - : c)); + ? (c % 360f) + : c)); } throw new IllegalArgumentException("Invalid color specification"); } - private static Color parseRGBColor(String color, int roff) - { + private static Color parseRGBColor(String color, int roff) { try { int rend = color.indexOf(',', roff); - int gend = rend < 0 ? -1 : color.indexOf(',', rend+1); - int bend = gend < 0 ? -1 : color.indexOf(gend+1); + int gend = rend < 0 ? -1 : color.indexOf(',', rend + 1); + int bend = gend < 0 ? -1 : color.indexOf(gend + 1); float r = parseComponent(color, roff, rend, PARSE_COMPONENT); - float g = parseComponent(color, rend+1, gend, PARSE_COMPONENT); - float b = parseComponent(color, gend+1, bend, PARSE_COMPONENT); + float g = parseComponent(color, rend + 1, gend, PARSE_COMPONENT); + float b = parseComponent(color, gend + 1, bend, PARSE_COMPONENT); return new Color(r, g, b); - } catch (NumberFormatException nfe) {} + } catch (NumberFormatException ignored) { + } throw new IllegalArgumentException("Invalid color specification"); } - private static Color parseHSLColor(String color, int hoff) - { + private static Color parseHSLColor(String color, int hoff) { try { int hend = color.indexOf(',', hoff); - int send = hend < 0 ? -1 : color.indexOf(',', hend+1); - int lend = send < 0 ? -1 : color.indexOf(send+1); + int send = hend < 0 ? -1 : color.indexOf(',', hend + 1); + int lend = send < 0 ? -1 : color.indexOf(send + 1); float h = parseComponent(color, hoff, hend, PARSE_ANGLE); - float s = parseComponent(color, hend+1, send, PARSE_PERCENT); - float l = parseComponent(color, send+1, lend, PARSE_PERCENT); + float s = parseComponent(color, hend + 1, send, PARSE_PERCENT); + float l = parseComponent(color, send + 1, lend, PARSE_PERCENT); return Color.getHSBColor(h, s, l); - } catch (NumberFormatException nfe) {} + } catch (NumberFormatException ignored) { + } throw new IllegalArgumentException("Invalid color specification"); } @@ -104,7 +104,8 @@ public class ColorUtil { try { Field field = java.awt.Color.class.getField(color.toLowerCase()); col = (Color) field.get(null); - } catch (Throwable ignore) {} + } catch (Throwable ignore) { + } if (col != null) { return col; } @@ -116,7 +117,6 @@ public class ColorUtil { int r; int g; int b; - int a; if (len == 3) { r = Integer.parseInt(color.substring(0, 1), 16); @@ -139,7 +139,8 @@ public class ColorUtil { b = Integer.parseInt(color.substring(4, 6), 16); return new Color(r, g, b); } - } catch (NumberFormatException nfe) {} + } catch (NumberFormatException ignored) { + } throw new IllegalArgumentException("Invalid color specification"); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/DelegateTextureUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/DelegateTextureUtil.java index 5aa095f62..386bf4b09 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/DelegateTextureUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/DelegateTextureUtil.java @@ -1,9 +1,7 @@ package com.boydti.fawe.util; -import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; -import com.sk89q.worldedit.world.block.BlockTypes; import java.awt.image.BufferedImage; import java.io.File; @@ -18,6 +16,10 @@ public class DelegateTextureUtil extends TextureUtil { this.parent = parent; } + public static int hueDistance(int red1, int green1, int blue1, int red2, int green2, int blue2) { + return TextureUtil.hueDistance(red1, green1, blue1, red2, green2, blue2); + } + @Override public BlockType getNearestBlock(int color) { return parent.getNearestBlock(color); @@ -123,10 +125,6 @@ public class DelegateTextureUtil extends TextureUtil { return parent.colorDistance(red1, green1, blue1, c2); } - public static int hueDistance(int red1, int green1, int blue1, int red2, int green2, int blue2) { - return TextureUtil.hueDistance(red1, green1, blue1, red2, green2, blue2); - } - @Override public long getDistance(BufferedImage image, int c1) { return parent.getDistance(image, c1); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/DocumentationPrinter.java b/worldedit-core/src/main/java/com/boydti/fawe/util/DocumentationPrinter.java index c24a30d8e..d81b165e6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/DocumentationPrinter.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/DocumentationPrinter.java @@ -24,28 +24,8 @@ import com.boydti.fawe.command.CFICommands; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandPermissions; import com.sk89q.minecraft.util.commands.NestedCommand; -import com.sk89q.worldedit.command.BiomeCommands; -import com.sk89q.worldedit.command.BrushCommands; -import com.sk89q.worldedit.command.BrushOptionsCommands; -import com.sk89q.worldedit.command.ChunkCommands; -import com.sk89q.worldedit.command.ClipboardCommands; -import com.sk89q.worldedit.command.GenerationCommands; -import com.sk89q.worldedit.command.HistoryCommands; -import com.sk89q.worldedit.command.MaskCommands; -import com.sk89q.worldedit.command.NavigationCommands; -import com.sk89q.worldedit.command.OptionsCommands; -import com.sk89q.worldedit.command.PatternCommands; -import com.sk89q.worldedit.command.RegionCommands; -import com.sk89q.worldedit.command.SchematicCommands; -import com.sk89q.worldedit.command.ScriptingCommands; -import com.sk89q.worldedit.command.SelectionCommands; -import com.sk89q.worldedit.command.SnapshotCommands; -import com.sk89q.worldedit.command.SnapshotUtilCommands; -import com.sk89q.worldedit.command.SuperPickaxeCommands; -import com.sk89q.worldedit.command.ToolCommands; -import com.sk89q.worldedit.command.TransformCommands; -import com.sk89q.worldedit.command.UtilityCommands; -import com.sk89q.worldedit.command.WorldEditCommands; +import com.sk89q.worldedit.command.*; + import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; @@ -74,9 +54,9 @@ public final class DocumentationPrinter { stream.print("## Overview\n"); stream.print("This page is generated from the source. " + - "Click one of the edit buttons below to modify a command class. " + - "You will need to find the parts which correspond to the documentation. " + - "Command documentation will be consistent with what is available ingame"); + "Click one of the edit buttons below to modify a command class. " + + "You will need to find the parts which correspond to the documentation. " + + "Command documentation will be consistent with what is available ingame"); stream.println(); stream.println(); stream.print("To view this information ingame use `//help [category|command]`\n"); @@ -179,10 +159,10 @@ public final class DocumentationPrinter { Command cmd = method.getAnnotation(Command.class); String[] aliases = cmd.aliases(); - String usage = prefix + aliases[0] + " " + cmd.usage(); + StringBuilder usage = new StringBuilder(prefix + aliases[0] + " " + cmd.usage()); if (!cmd.flags().isEmpty()) { for (char c : cmd.flags().toCharArray()) { - usage += " [-" + c + "]"; + usage.append(" [-").append(c).append("]"); } } // stream.append("#### [`" + usage + "`](" + "https://github.com/boy0001/FastAsyncWorldedit/wiki/" + aliases[0] + ")\n"); @@ -205,7 +185,9 @@ public final class DocumentationPrinter { } } stream.append("\n"); - if (title) stream.append("---"); + if (title) { + stream.append("---"); + } stream.append("\n"); stream.append("\n"); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/EditSessionBuilder.java b/worldedit-core/src/main/java/com/boydti/fawe/util/EditSessionBuilder.java index a20c8d3d5..6cfaf5cfd 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/EditSessionBuilder.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/EditSessionBuilder.java @@ -4,7 +4,11 @@ import com.boydti.fawe.Fawe; import com.boydti.fawe.FaweAPI; import com.boydti.fawe.config.Settings; import com.boydti.fawe.logging.rollback.RollbackOptimizedHistory; -import com.boydti.fawe.object.*; +import com.boydti.fawe.object.FaweLimit; +import com.boydti.fawe.object.FawePlayer; +import com.boydti.fawe.object.FaweQueue; +import com.boydti.fawe.object.NullChangeSet; +import com.boydti.fawe.object.RegionWrapper; import com.boydti.fawe.object.changeset.DiskStorageHistory; import com.boydti.fawe.object.changeset.FaweChangeSet; import com.boydti.fawe.object.changeset.MemoryOptimizedHistory; @@ -14,9 +18,10 @@ import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.eventbus.EventBus; import com.sk89q.worldedit.world.World; -import java.util.UUID; + import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.UUID; import static com.google.common.base.Preconditions.checkNotNull; @@ -102,8 +107,8 @@ public class EditSessionBuilder { } /** - * @param disk If it should be stored on disk - * @param uuid The uuid to store it under (if on disk) + * @param disk If it should be stored on disk + * @param uuid The uuid to store it under (if on disk) * @param compression Compression level (0-9) * @return */ @@ -191,6 +196,6 @@ public class EditSessionBuilder { } public EditSession build() { - return new EditSession(worldName, world, queue, player, limit, changeSet, allowedRegions, autoQueue, fastmode, checkMemory, combineStages, blockBag, eventBus, event); + return new EditSession(worldName, world, queue, player, limit, changeSet, allowedRegions, autoQueue, fastmode, checkMemory, combineStages, blockBag, eventBus, event); } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ExtentTraverser.java b/worldedit-core/src/main/java/com/boydti/fawe/util/ExtentTraverser.java index 64a0a6e3d..ab3d0244e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ExtentTraverser.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/ExtentTraverser.java @@ -2,6 +2,7 @@ package com.boydti.fawe.util; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; + import java.lang.reflect.Field; public class ExtentTraverser { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/FaweTimer.java b/worldedit-core/src/main/java/com/boydti/fawe/util/FaweTimer.java index f52a33e5f..6ae540e38 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/FaweTimer.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/FaweTimer.java @@ -3,13 +3,17 @@ package com.boydti.fawe.util; public class FaweTimer implements Runnable { private final double[] history = new double[]{20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d}; + private final long tickInterval = 5; + private final double millisPer20Interval = tickInterval * 50 * 20; private int historyIndex = 0; private long lastPoll = System.currentTimeMillis(); private long tickStart = System.currentTimeMillis(); - private final long tickInterval = 5; - private final double millisPer20Interval = tickInterval * 50 * 20; private long tick = 0; private long tickMod = 0; + private long lastGetTPSTick = 0; + private double lastGetTPSValue = 20d; + private long skip = 0; + private long skipTick = 0; @Override public void run() { @@ -32,9 +36,6 @@ public class FaweTimer implements Runnable { lastPoll = tickStart; } - private long lastGetTPSTick = 0; - private double lastGetTPSValue = 20d; - public double getTPS() { if (tick < lastGetTPSTick + tickInterval) { return lastGetTPSValue; @@ -60,9 +61,6 @@ public class FaweTimer implements Runnable { return tickStart; } - private long skip = 0; - private long skipTick = 0; - public boolean isAbove(double tps) { if (tps <= 0) { return true; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/FilteredTextureUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/FilteredTextureUtil.java index 25a711786..632e3030c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/FilteredTextureUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/FilteredTextureUtil.java @@ -1,9 +1,5 @@ package com.boydti.fawe.util; -import com.boydti.fawe.FaweCache; - -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; @@ -11,11 +7,9 @@ import java.io.FileNotFoundException; import java.util.Set; public class FilteredTextureUtil extends TextureUtil { - private final Set blocks; public FilteredTextureUtil(TextureUtil parent, Set blocks) throws FileNotFoundException { super(parent.getFolder()); - this.blocks = blocks; this.validMixBiomeColors = parent.validMixBiomeColors; this.validMixBiomeIds = parent.validMixBiomeIds; this.validBiomes = parent.validBiomes; @@ -27,7 +21,9 @@ public class FilteredTextureUtil extends TextureUtil { int num = 0; for (int i = 0; i < parent.validBlockIds.length; i++) { BlockType block = BlockTypes.get(parent.validBlockIds[i]); - if (blocks.contains(block)) num++; + if (blocks.contains(block)) { + num++; + } } this.validBlockIds = new int[num]; this.validColors = new int[num]; @@ -41,4 +37,4 @@ public class FilteredTextureUtil extends TextureUtil { } this.calculateLayerArrays(); } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/IOUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/IOUtil.java index 25236077a..80a43220f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/IOUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/IOUtil.java @@ -1,48 +1,41 @@ package com.boydti.fawe.util; -import java.io.*; +import java.io.DataOutput; +import java.io.EOFException; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.net.URI; public final class IOUtil { - public InputStream toInputStream(URI uri) throws IOException { - String scheme = uri.getScheme(); - switch (scheme.toLowerCase()) { - case "file": - return new FileInputStream(uri.getPath()); - case "http": - case "https": - return uri.toURL().openStream(); - default: - return null; - } - } - - public static final int readInt(InputStream in) throws IOException { + public static int readInt(InputStream in) throws IOException { int ch1 = in.read(); int ch2 = in.read(); int ch3 = in.read(); int ch4 = in.read(); - if ((ch1 | ch2 | ch3 | ch4) < 0) + if ((ch1 | ch2 | ch3 | ch4) < 0) { throw new EOFException(); + } return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); } - public static final void writeInt(OutputStream out, int v) throws IOException { + public static void writeInt(OutputStream out, int v) throws IOException { out.write((v >>> 24) & 0xFF); out.write((v >>> 16) & 0xFF); - out.write((v >>> 8) & 0xFF); - out.write((v >>> 0) & 0xFF); + out.write((v >>> 8) & 0xFF); + out.write((v >>> 0) & 0xFF); } - public static final void writeVarInt(final OutputStream out, int i) throws IOException { - while((i & -128) != 0) { + public static void writeVarInt(final OutputStream out, int i) throws IOException { + while ((i & -128) != 0) { out.write(i & 127 | 128); i >>>= 7; } out.write(i); } - public static final int readVarInt(InputStream in) throws IOException { + public static int readVarInt(InputStream in) throws IOException { int i = 0; int offset = 0; int b; @@ -54,7 +47,7 @@ public final class IOUtil { return i; } - public static final void copy(InputStream in, OutputStream out) throws IOException { + public static void copy(InputStream in, OutputStream out) throws IOException { byte[] buf = new byte[8192]; while (true) { int r = in.read(buf); @@ -65,7 +58,7 @@ public final class IOUtil { } } - public static final int copy(InputStream in, OutputStream out, int len) throws IOException { + public static int copy(InputStream in, OutputStream out, int len) throws IOException { byte[] buf = new byte[8192]; while (len > 0) { int r = in.read(buf, 0, Math.min(buf.length, len)); @@ -78,7 +71,7 @@ public final class IOUtil { return len; } - public static final void copy(InputStream in, DataOutput out) throws IOException { + public static void copy(InputStream in, DataOutput out) throws IOException { byte[] buf = new byte[8192]; while (true) { int r = in.read(buf); @@ -88,4 +81,5 @@ public final class IOUtil { out.write(buf, 0, r); } } + } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ImgurUtility.java b/worldedit-core/src/main/java/com/boydti/fawe/util/ImgurUtility.java index 83a0a3087..e90dcadf0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ImgurUtility.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/ImgurUtility.java @@ -1,9 +1,12 @@ package com.boydti.fawe.util; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; import com.google.gson.Gson; import com.google.gson.JsonObject; -import java.io.*; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; @@ -12,21 +15,6 @@ import java.util.Base64; public class ImgurUtility { public static final String CLIENT_ID = "50e34b65351eb07"; - public static URL uploadImage(File file) throws IOException { - return uploadImage(new FileInputStream(file)); - } - - public static URL uploadImage(InputStream is) throws IOException { - is = new BufferedInputStream(is); - FastByteArrayOutputStream baos = new FastByteArrayOutputStream(Short.MAX_VALUE); - int d; - while ((d = is.read()) != -1) { - baos.write(d); - } - baos.flush(); - return uploadImage(baos.toByteArray()); - } - public static URL uploadImage(byte[] image) throws IOException { String json = getImgurContent(CLIENT_ID, image); Gson gson = new Gson(); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/IncendoPaster.java b/worldedit-core/src/main/java/com/boydti/fawe/util/IncendoPaster.java index 86a415298..08ffaeba4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/IncendoPaster.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/IncendoPaster.java @@ -5,12 +5,23 @@ import com.google.common.base.Charsets; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.nio.file.Files; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; /** * Single class paster for the Incendo paste service @@ -28,8 +39,8 @@ public final class IncendoPaster { * Valid paste applications */ public static final Collection - VALID_APPLICATIONS = Arrays - .asList("plotsquared", "fastasyncworldedit", "incendopermissions", "kvantum"); + VALID_APPLICATIONS = Arrays + .asList("plotsquared", "fastasyncworldedit", "incendopermissions", "kvantum"); private final Collection files = new ArrayList<>(); private final String pasteApplication; @@ -45,11 +56,85 @@ public final class IncendoPaster { } if (!VALID_APPLICATIONS.contains(pasteApplication.toLowerCase(Locale.ENGLISH))) { throw new IllegalArgumentException( - String.format("Unknown application name: %s", pasteApplication)); + String.format("Unknown application name: %s", pasteApplication)); } this.pasteApplication = pasteApplication; } + public static String debugPaste() throws IOException { + final IncendoPaster incendoPaster = new IncendoPaster("fastasyncworldedit"); + + StringBuilder b = new StringBuilder(); + b.append( + "# Welcome to this paste\n# It is meant to provide us at IntellectualSites with better information about your " + + "problem\n"); + b.append("\n# Server Information\n"); + b.append("server.platform: ").append(Fawe.imp().getPlatform()).append('\n'); + b.append(Fawe.imp().getDebugInfo()).append('\n'); + b.append("\n\n# YAY! Now, let's see what we can find in your JVM\n"); + Runtime runtime = Runtime.getRuntime(); + b.append("memory.free: ").append(runtime.freeMemory()).append('\n'); + b.append("memory.max: ").append(runtime.maxMemory()).append('\n'); + b.append("java.specification.version: '").append(System.getProperty("java.specification.version")).append("'\n"); + b.append("java.vendor: '").append(System.getProperty("java.vendor")).append("'\n"); + b.append("java.version: '").append(System.getProperty("java.version")).append("'\n"); + b.append("os.arch: '").append(System.getProperty("os.arch")).append("'\n"); + b.append("os.name: '").append(System.getProperty("os.name")).append("'\n"); + b.append("os.version: '").append(System.getProperty("os.version")).append("'\n\n"); + b.append("# Okay :D Great. You are now ready to create your bug report!"); + b.append("\n# You can do so at https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13/issues"); + b.append("\n# or via our Discord at https://discord.gg/ngZCzbU"); + incendoPaster.addFile(new IncendoPaster.PasteFile("information", b.toString())); + + try { + final File logFile = new File(Fawe.imp().getDirectory(), "../../logs/latest.log"); + final String file; + if (Files.size(logFile.toPath()) > 14_000_000) { + file = "too big :("; + } else { + file = readFile(logFile); + } + incendoPaster.addFile(new IncendoPaster.PasteFile("latest.log", file)); + } catch (IOException ignored) { + } + + incendoPaster.addFile(new PasteFile("config.yml", readFile(new File(Fawe.imp().getDirectory(), "config.yml")))); + incendoPaster.addFile(new PasteFile("config-legacy.yml", readFile(new File(Fawe.imp().getDirectory(), "config-legacy.yml")))); + incendoPaster.addFile(new PasteFile("message.yml", readFile(new File(Fawe.imp().getDirectory(), "message.yml")))); + incendoPaster.addFile(new PasteFile("commands.yml", readFile(new File(Fawe.imp().getDirectory(), "commands.yml")))); + + final String rawResponse; + try { + rawResponse = incendoPaster.upload(); + } catch (Throwable throwable) { + throw new IOException(String.format("Failed to upload files: %s", throwable.getMessage()), throwable); + } + final JsonObject jsonObject = new JsonParser().parse(rawResponse).getAsJsonObject(); + + if (jsonObject.has("created")) { + final String pasteId = jsonObject.get("paste_id").getAsString(); + return String.format("https://athion.net/ISPaster/paste/view/%s", pasteId); + } else { + throw new IOException(String.format("Failed to upload files: %s", + jsonObject.get("response").getAsString())); + } + } + + private static String readFile(final File file) throws IOException { + final StringBuilder content = new StringBuilder(); + final List lines = new ArrayList<>(); + try (final BufferedReader reader = new BufferedReader(new FileReader(file))) { + String line; + while ((line = reader.readLine()) != null) { + lines.add(line); + } + } + for (int i = Math.max(0, lines.size() - 1000); i < lines.size(); i++) { + content.append(lines.get(i)).append("\n"); + } + return content.toString(); + } + /** * Get an immutable collection containing all the files that have been added to this paster * @@ -72,7 +157,7 @@ public final class IncendoPaster { for (final PasteFile pasteFile : this.files) { if (pasteFile.fileName.equalsIgnoreCase(file.getFileName())) { throw new IllegalArgumentException(String.format("Found duplicate file with name %s", - file.getFileName())); + file.getFileName())); } } this.files.add(file); @@ -99,7 +184,7 @@ public final class IncendoPaster { while (fileIterator.hasNext()) { final PasteFile file = fileIterator.next(); builder.append("\"file-").append(file.getFileName()).append("\": \"") - .append(file.getContent().replaceAll("\"", "\\\\\"")).append("\""); + .append(file.getContent().replaceAll("\"", "\\\\\"")).append("\""); if (fileIterator.hasNext()) { builder.append(",\n"); } @@ -130,7 +215,7 @@ public final class IncendoPaster { } if (!httpURLConnection.getResponseMessage().contains("OK")) { throw new IllegalStateException(String.format("Server returned status: %d %s", - httpURLConnection.getResponseCode(), httpURLConnection.getResponseMessage())); + httpURLConnection.getResponseCode(), httpURLConnection.getResponseMessage())); } final StringBuilder input = new StringBuilder(); try (final BufferedReader inputStream = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()))) { @@ -186,78 +271,4 @@ public final class IncendoPaster { } } - public static String debugPaste() throws IOException { - final IncendoPaster incendoPaster = new IncendoPaster("fastasyncworldedit"); - - StringBuilder b = new StringBuilder(); - b.append( - "# Welcome to this paste\n# It is meant to provide us at IntellectualSites with better information about your " - + "problem\n"); - b.append("\n# Server Information\n"); - b.append("server.platform: ").append(Fawe.imp().getPlatform()).append('\n'); - b.append(Fawe.imp().getDebugInfo()).append('\n'); - b.append("\n\n# YAY! Now, let's see what we can find in your JVM\n"); - Runtime runtime = Runtime.getRuntime(); - b.append("memory.free: ").append(runtime.freeMemory()).append('\n'); - b.append("memory.max: ").append(runtime.maxMemory()).append('\n'); - b.append("java.specification.version: '").append(System.getProperty("java.specification.version")).append("'\n"); - b.append("java.vendor: '").append(System.getProperty("java.vendor")).append("'\n"); - b.append("java.version: '").append(System.getProperty("java.version")).append("'\n"); - b.append("os.arch: '").append(System.getProperty("os.arch")).append("'\n"); - b.append("os.name: '").append(System.getProperty("os.name")).append("'\n"); - b.append("os.version: '").append(System.getProperty("os.version")).append("'\n\n"); - b.append("# Okay :D Great. You are now ready to create your bug report!"); - b.append("\n# You can do so at https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13/issues"); - b.append("\n# or via our Discord at https://discord.gg/ngZCzbU"); - incendoPaster.addFile(new IncendoPaster.PasteFile("information", b.toString())); - - try { - final File logFile = new File(Fawe.imp().getDirectory(), "../../logs/latest.log"); - final String file; - if (Files.size(logFile.toPath()) > 14_000_000) { - file = "too big :("; - } else { - file = readFile(logFile); - } - incendoPaster.addFile(new IncendoPaster.PasteFile("latest.log", file)); - } catch (IOException ignored) { - } - - incendoPaster.addFile(new PasteFile("config.yml", readFile(new File(Fawe.imp().getDirectory(), "config.yml")))); - incendoPaster.addFile(new PasteFile("config-legacy.yml", readFile(new File(Fawe.imp().getDirectory(), "config-legacy.yml")))); - incendoPaster.addFile(new PasteFile("message.yml", readFile(new File(Fawe.imp().getDirectory(), "message.yml")))); - incendoPaster.addFile(new PasteFile("commands.yml", readFile(new File(Fawe.imp().getDirectory(), "commands.yml")))); - - final String rawResponse; - try { - rawResponse = incendoPaster.upload(); - } catch (Throwable throwable) { - throw new IOException(String.format("Failed to upload files: %s", throwable.getMessage()), throwable); - } - final JsonObject jsonObject = new JsonParser().parse(rawResponse).getAsJsonObject(); - - if (jsonObject.has("created")) { - final String pasteId = jsonObject.get("paste_id").getAsString(); - return String.format("https://athion.net/ISPaster/paste/view/%s", pasteId); - } else { - throw new IOException(String.format("Failed to upload files: %s", - jsonObject.get("response").getAsString())); - } - } - - private static String readFile(final File file) throws IOException { - final StringBuilder content = new StringBuilder(); - final List lines = new ArrayList<>(); - try (final BufferedReader reader = new BufferedReader(new FileReader(file))) { - String line; - while ((line = reader.readLine()) != null) { - lines.add(line); - } - } - for (int i = Math.max(0, lines.size() - 1000); i < lines.size(); i++) { - content.append(lines.get(i)).append("\n"); - } - return content.toString(); - } - } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/Jars.java b/worldedit-core/src/main/java/com/boydti/fawe/util/Jars.java index 41d165e25..95b78c54c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/Jars.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/Jars.java @@ -1,6 +1,7 @@ package com.boydti.fawe.util; import com.boydti.fawe.Fawe; + import java.io.DataInputStream; import java.io.IOException; import java.net.URL; @@ -11,10 +12,10 @@ import java.util.Base64; public enum Jars { MM_v1_4_0("https://github.com/InventivetalentDev/MapManager/releases/download/1.4.0-SNAPSHOT/MapManager_v1.4.0-SNAPSHOT.jar", - "AEO5SKBUGN4YJRS8XGGNLBM2QRZPTI1KF0/1W1URTGA=", 163279), + "AEO5SKBUGN4YJRS8XGGNLBM2QRZPTI1KF0/1W1URTGA=", 163279), PL_v3_6_0("https://github.com/InventivetalentDev/PacketListenerAPI/releases/download/3.6.0-SNAPSHOT/PacketListenerAPI_v3.6.0-SNAPSHOT.jar", - "OYBE75VIU+NNWHRVREBLDARWA+/TBDQZ1RC562QULBA=", 166508), + "OYBE75VIU+NNWHRVREBLDARWA+/TBDQZ1RC562QULBA=", 166508), ; @@ -23,12 +24,9 @@ public enum Jars { public final String digest; /** - * @param url - * Where this jar can be found and downloaded - * @param digest - * The SHA-256 hexadecimal digest - * @param filesize - * Size of this jar in bytes + * @param url Where this jar can be found and downloaded + * @param digest The SHA-256 hexadecimal digest + * @param filesize Size of this jar in bytes */ Jars(String url, String digest, int filesize) { this.url = url; @@ -36,7 +34,9 @@ public enum Jars { this.filesize = filesize; } - /** download a jar, verify hash, return byte[] containing the jar */ + /** + * download a jar, verify hash, return byte[] containing the jar + */ public byte[] download() throws IOException { byte[] jarBytes = new byte[this.filesize]; URL url = new URL(this.url); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/MainUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/MainUtil.java index 262c4e933..8c3ab78b5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/MainUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/MainUtil.java @@ -3,19 +3,35 @@ package com.boydti.fawe.util; import com.boydti.fawe.Fawe; import com.boydti.fawe.config.BBC; import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.*; +import com.boydti.fawe.object.FaweInputStream; +import com.boydti.fawe.object.FaweOutputStream; +import com.boydti.fawe.object.FawePlayer; +import com.boydti.fawe.object.RegionWrapper; +import com.boydti.fawe.object.RunnableVal; +import com.boydti.fawe.object.RunnableVal2; import com.boydti.fawe.object.changeset.CPUOptimizedChangeSet; import com.boydti.fawe.object.changeset.FaweStreamChangeSet; import com.boydti.fawe.object.io.AbstractDelegateOutputStream; import com.github.luben.zstd.ZstdInputStream; import com.github.luben.zstd.ZstdOutputStream; -import com.sk89q.jnbt.*; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.DoubleTag; +import com.sk89q.jnbt.IntTag; +import com.sk89q.jnbt.ListTag; +import com.sk89q.jnbt.StringTag; +import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; import com.sk89q.worldedit.history.changeset.ChangeSet; import com.sk89q.worldedit.util.Location; -import net.jpountz.lz4.*; +import net.jpountz.lz4.LZ4BlockInputStream; +import net.jpountz.lz4.LZ4BlockOutputStream; +import net.jpountz.lz4.LZ4Compressor; +import net.jpountz.lz4.LZ4Factory; +import net.jpountz.lz4.LZ4FastDecompressor; +import net.jpountz.lz4.LZ4InputStream; +import net.jpountz.lz4.LZ4Utils; import javax.annotation.Nullable; import javax.imageio.ImageIO; @@ -23,28 +39,49 @@ import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.lang.reflect.Array; -import java.lang.reflect.Method; -import java.net.*; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; import java.nio.charset.StandardCharsets; -import java.nio.file.*; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import java.util.List; -import java.util.*; -import java.util.Map.Entry; +import java.util.Map; +import java.util.Scanner; +import java.util.UUID; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.regex.Pattern; -import java.util.zip.*; +import java.util.zip.DataFormatException; +import java.util.zip.Deflater; +import java.util.zip.GZIPInputStream; +import java.util.zip.Inflater; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import static java.lang.System.arraycopy; public class MainUtil { + private static final LZ4Factory FACTORY = LZ4Factory.fastestInstance(); + private static final LZ4Compressor COMPRESSOR = FACTORY.fastCompressor(); + private static final LZ4FastDecompressor DECOMPRESSOR = FACTORY.fastDecompressor(); + /* * Generic non plugin related utils * e.g. sending messages @@ -105,10 +142,6 @@ public class MainUtil { return Double.parseDouble(version.substring(0, pos)); } - public static void stacktrace() { - new Exception().printStackTrace(); - } - public static void traverse(Path path, final BiConsumer onEach) { try { Files.walkFileTree(path, new SimpleFileVisitor() { @@ -137,7 +170,9 @@ public class MainUtil { } public static File resolveRelative(File file) { - if (!file.exists()) return new File(relativize(file.getPath())); + if (!file.exists()) { + return new File(relativize(file.getPath())); + } return file; } @@ -147,11 +182,15 @@ public class MainUtil { int skip = 0; int len = split.length - 1; for (int i = len; i >= 0; i--) { - if (skip > 0) skip--; - else { + if (skip > 0) { + skip--; + } else { String arg = split[i]; - if (arg.equals("..")) skip++; - else out.insert(0, arg + (i == len ? "" : File.separator)); + if (arg.equals("..")) { + skip++; + } else { + out.insert(0, arg + (i == len ? "" : File.separator)); + } } } return out.toString(); @@ -159,9 +198,13 @@ public class MainUtil { public static void forEachFile(Path path, final RunnableVal2 onEach, Comparator comparator) { File dir = path.toFile(); - if (!dir.exists()) return; + if (!dir.exists()) { + return; + } File[] files = path.toFile().listFiles(); - if (comparator != null) Arrays.sort(files, comparator); + if (comparator != null) { + Arrays.sort(files, comparator); + } for (File file : files) { Path filePath = file.toPath(); try { @@ -182,9 +225,13 @@ public class MainUtil { val = StringMan.toInteger(name, 0, name.length()); } else { int i = name.lastIndexOf('.'); - if (i != -1) val = StringMan.toInteger(name, 0, i); + if (i != -1) { + val = StringMan.toInteger(name, 0, i); + } + } + if (val != null && val > max[0]) { + max[0] = val; } - if (val != null && val > max[0]) max[0] = val; return false; }); return max[0] + 1; @@ -222,10 +269,6 @@ public class MainUtil { return getCompressedOS(os, amount, Settings.IMP.HISTORY.BUFFER_SIZE); } - private static final LZ4Factory FACTORY = LZ4Factory.fastestInstance(); - private static final LZ4Compressor COMPRESSOR = FACTORY.fastCompressor(); - private static final LZ4FastDecompressor DECOMPRESSOR = FACTORY.fastDecompressor(); - public static int getMaxCompressedLength(int size) { return LZ4Utils.maxCompressedLength(size); } @@ -244,7 +287,9 @@ public class MainUtil { ByteArrayOutputStream baos = new ByteArrayOutputStream(); while (!deflate.finished()) { int n = deflate.deflate(buffer); - if (n != 0) baos.write(buffer, 0, n); + if (n != 0) { + baos.write(buffer, 0, n); + } } return baos.toByteArray(); } @@ -262,7 +307,9 @@ public class MainUtil { ByteArrayOutputStream baos = new ByteArrayOutputStream(); while (!inflater.finished()) { int n = inflater.inflate(buffer); - if (n != 0) baos.write(buffer, 0, n); + if (n != 0) { + baos.write(buffer, 0, n); + } } return baos.toByteArray(); } @@ -444,36 +491,6 @@ public class MainUtil { } } - private static final Class[] parameters = new Class[]{URL.class}; - - public static ClassLoader loadURLClasspath(URL u) throws IOException { - ClassLoader sysloader = ClassLoader.getSystemClassLoader(); - - Class sysclass = URLClassLoader.class; - - try { - Method method = sysclass.getDeclaredMethod("addURL", parameters); - method.setAccessible(true); - if (sysloader instanceof URLClassLoader) { - method.invoke(sysloader, new Object[]{u}); - } else { - ClassLoader loader = MainUtil.class.getClassLoader(); - while (!(loader instanceof URLClassLoader) && loader.getParent() != null) { - loader = loader.getParent(); - } - if (loader instanceof URLClassLoader) { - method.invoke(sysloader, new Object[]{u}); - } else { - loader = new URLClassLoader(new URL[]{u}, MainUtil.class.getClassLoader()); - return loader; - } - } - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - return sysloader; - } - public static String getText(String url) throws IOException { try (Scanner scanner = new Scanner(new URL(url).openStream(), "UTF-8")) { return scanner.useDelimiter("\\A").next(); @@ -551,12 +568,12 @@ public class MainUtil { } public static Thread[] getThreads() { - ThreadGroup rootGroup = Thread.currentThread( ).getThreadGroup( ); + ThreadGroup rootGroup = Thread.currentThread().getThreadGroup(); ThreadGroup parentGroup; - while ( ( parentGroup = rootGroup.getParent() ) != null ) { + while ((parentGroup = rootGroup.getParent()) != null) { rootGroup = parentGroup; } - Thread[] threads = new Thread[ rootGroup.activeCount() ]; + Thread[] threads = new Thread[rootGroup.activeCount()]; if (threads.length != 0) { while (rootGroup.enumerate(threads, true) == threads.length) { threads = new Thread[threads.length * 2]; @@ -598,7 +615,9 @@ public class MainUtil { } public static BufferedImage toRGB(BufferedImage src) { - if (src == null) return src; + if (src == null) { + return src; + } BufferedImage img = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.drawImage(src, 0, 0, null); @@ -676,60 +695,6 @@ public class MainUtil { // if (!debug) { e.printStackTrace(); return; -// } -// String header = "====== FAWE: " + e.getLocalizedMessage() + " ======"; -// Fawe.debug(header); -// String[] trace = getTrace(e); -// for (int i = 0; i < trace.length && i < 8; i++) { -// Fawe.debug(" - " + trace[i]); -// } -// String[] cause = getTrace(e.getCause()); -// Fawe.debug("Cause: " + (cause.length == 0 ? "N/A" : "")); -// for (int i = 0; i < cause.length && i < 8; i++) { -// Fawe.debug(" - " + cause[i]); -// } -// Fawe.debug(StringMan.repeat("=", header.length())); - } - - public static String[] getTrace(Throwable e) { - if (e == null) { - return new String[0]; - } - StackTraceElement[] elems = e.getStackTrace(); - String[] msg = new String[elems.length];//[elems.length + 1]; -// HashSet packages = new HashSet<>(); - for (int i = 0; i < elems.length; i++) { - StackTraceElement elem = elems[i]; - elem.getLineNumber(); - String methodName = elem.getMethodName(); - int index = elem.getClassName().lastIndexOf('.'); - String className = elem.getClassName(); -// if (!(index == -1 || className.startsWith("io.netty") || className.startsWith("javax") || className.startsWith("java") || className.startsWith("sun") || className.startsWith("net.minecraft") || className.startsWith("org.spongepowered") || className.startsWith("org.bukkit") || className.startsWith("com.google"))) { -// packages.add(className.substring(0, index-1)); -// } - String name = className.substring(index == -1 ? 0 : index + 1); - name = name.length() == 0 ? elem.getClassName() : name; - String argString = "(...)"; - try { - for (Method method : Class.forName(elem.getClassName()).getDeclaredMethods()) { - if (method.getName().equals(methodName)) { - Class[] params = method.getParameterTypes(); - argString = ""; - String prefix = ""; - for (Class param : params) { - argString += prefix + param.getSimpleName(); - prefix = ","; - } - argString = "[" + method.getReturnType().getSimpleName() + "](" + argString + ")"; - break; - } - } - } catch (Throwable ignore) { - } - msg[i] = name + "." + methodName + argString + ":" + elem.getLineNumber(); - } -// msg[msg.length-1] = StringMan.getString(packages); - return msg; } public static void warnDeprecated(Class... alternatives) { @@ -746,16 +711,12 @@ public class MainUtil { String className = creatorElement.getClassName(); Class clazz = Class.forName(className); String creator = clazz.getSimpleName(); - String packageName = clazz.getPackage().getName(); - StackTraceElement deprecatedElement = stack; - String myName = Class.forName(deprecatedElement.getClassName()).getSimpleName(); - Fawe.debug("@" + creator + " used by " + myName + "." + deprecatedElement.getMethodName() + "():" + deprecatedElement.getLineNumber() + " is deprecated."); + String myName = Class.forName(stack.getClassName()).getSimpleName(); + Fawe.debug("@" + creator + " used by " + myName + "." + stack.getMethodName() + "():" + stack.getLineNumber() + " is deprecated."); Fawe.debug(" - Alternatives: " + StringMan.getString(alternatives)); } catch (Throwable throwable) { throwable.printStackTrace(); - } finally { - break; } } } @@ -782,7 +743,9 @@ public class MainUtil { break; case '.': res[index--] = val; - if (index == -1) return res; + if (index == -1) { + return res; + } val = 0; numIndex = 1; break; @@ -805,18 +768,26 @@ public class MainUtil { } if (allowDir) { File file = MainUtil.resolveRelative(new File(dir, filename)); - if (file.exists() && file.isDirectory()) return file; + if (file.exists() && file.isDirectory()) { + return file; + } } for (ClipboardFormat f : ClipboardFormats.getAll()) { File file = MainUtil.resolveRelative(new File(dir, filename + "." + f.getPrimaryFileExtension())); - if (file.exists()) return file; + if (file.exists()) { + return file; + } } return null; } public static boolean isInSubDirectory(File dir, File file) throws IOException { - if (file == null) return false; - if (file.equals(dir)) return true; + if (file == null) { + return false; + } + if (file.equals(dir)) { + return true; + } file = file.getCanonicalFile(); dir = dir.getCanonicalFile(); return isInSubDirectory(dir, file.getParentFile()); @@ -980,10 +951,6 @@ public class MainUtil { return time; } - public static void deleteOlder(File directory, final long timeDiff) { - deleteOlder(directory, timeDiff, true); - } - public static void deleteOlder(File directory, final long timeDiff, boolean printDebug) { final long now = System.currentTimeMillis(); ForkJoinPool pool = new ForkJoinPool(); @@ -991,7 +958,9 @@ public class MainUtil { long age = now - file.lastModified(); if (age > timeDiff) { pool.submit(file::delete); - if (printDebug) BBC.FILE_DELETED.send(null, file); + if (printDebug) { + BBC.FILE_DELETED.send(null, file); + } } }); pool.shutdown(); @@ -1002,49 +971,6 @@ public class MainUtil { } } - public static boolean deleteDirectory(File directory) { - return deleteDirectory(directory, true); - } - - public static boolean deleteDirectory(File directory, boolean printDebug) { - if (directory.exists()) { - File[] files = directory.listFiles(); - if (null != files) { - for (File file : files) { - if (file.isDirectory()) { - deleteDirectory(file, printDebug); - } else { - file.delete(); - if (printDebug) BBC.FILE_DELETED.send(null, file); - } - } - } - } - return (directory.delete()); - } - - public static boolean isValidTag(Tag tag) { - if (tag instanceof EndTag) { - return false; - } else if (tag instanceof ListTag) { - ListTag lt = (ListTag) tag; - if ((lt).getType() == EndTag.class) { - return false; - } - } else if (tag instanceof CompoundTag) { - for (Entry entry : ((CompoundTag) tag).getValue().entrySet()) { - if (!isValidTag(entry.getValue())) { - return false; - } - } - } - return true; - } - - public enum OS { - LINUX, WINDOWS, MACOS, UNKNOWN; - } - public static File getWorkingDirectory(String applicationName) { String userHome = System.getProperty("user.home", "."); File workingDirectory; @@ -1088,4 +1014,8 @@ public class MainUtil { } return OS.UNKNOWN; } + + public enum OS { + LINUX, WINDOWS, MACOS, UNKNOWN; + } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/MaskTraverser.java b/worldedit-core/src/main/java/com/boydti/fawe/util/MaskTraverser.java index 4f524e5e1..b688ca096 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/MaskTraverser.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/MaskTraverser.java @@ -3,6 +3,7 @@ package com.boydti.fawe.util; import com.boydti.fawe.object.mask.ResettableMask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; + import java.lang.reflect.Field; import java.util.Collection; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/MathMan.java b/worldedit-core/src/main/java/com/boydti/fawe/util/MathMan.java index 711de5ff8..578e8cafe 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/MathMan.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/MathMan.java @@ -4,6 +4,7 @@ public class MathMan { /** * Optimized for i elem 0,65536 (characters) + * * @param i * @return square root */ @@ -22,7 +23,7 @@ public class MathMan { return CachedMathMan.cosInexact(paramFloat); } - public static int log2nlz( int bits ) { + public static int log2nlz(int bits) { return Integer.SIZE - Integer.numberOfLeadingZeros(bits); } @@ -51,16 +52,6 @@ public class MathMan { return max; } - public static int min(int... values) { - int min = Integer.MAX_VALUE; - for (int d : values) { - if (d < min) { - min = d; - } - } - return min; - } - public static double min(double... values) { double min = Double.MAX_VALUE; for (double d : values) { @@ -71,11 +62,6 @@ public class MathMan { return min; } - public static int ceilZero(float floatNumber) { - int floor = (int) floatNumber; - return floatNumber > (float) floor ? floor + 1 : floor; - } - public static int sqr(int val) { return val * val; } @@ -121,72 +107,59 @@ public class MathMan { } } - public static final long inverseRound(double val) { - long round = Math.round(val); - return (long) (round + Math.signum(val - round)); - } - - public static final int pair(short x, short y) { + public static int pair(short x, short y) { return (x << 16) | (y & 0xFFFF); } - public static final short unpairX(int hash) { + public static short unpairX(int hash) { return (short) (hash >> 16); } - public static final short unpairY(int hash) { + public static short unpairY(int hash) { return (short) (hash & 0xFFFF); } - public static final short pairByte(int x, int y) { + public static short pairByte(int x, int y) { return (short) ((x << 8) | (y & 0xFF)); } - public static final byte unpairShortX(short pair) { + public static byte unpairShortX(short pair) { return (byte) (pair >> 8); } - public static final byte unpairShortY(short pair) { + public static byte unpairShortY(short pair) { return (byte) pair; } - public static final long pairInt(int x, int y) { + public static long pairInt(int x, int y) { return (((long) x) << 32) | (y & 0xffffffffL); } - public static final long tripleWorldCoord(int x, int y, int z) { - return y + (((long) x & 0x3FFFFFF) << 8) + (((long) z & 0x3FFFFFF) << 34); - } - - public static final long untripleWorldCoordX(long triple) { + public static long untripleWorldCoordX(long triple) { return (((triple >> 8) & 0x3FFFFFF) << 38) >> 38; } - public static final long untripleWorldCoordY(long triple) { + public static long untripleWorldCoordY(long triple) { return triple & 0xFF; } - public static final long untripleWorldCoordZ(long triple) { - return (((triple >> 34) & 0x3FFFFFF) << 38) >> 38; - } - - public static final short tripleBlockCoord(int x, int y, int z) { + public static short tripleBlockCoord(int x, int y, int z) { return (short) ((x & 15) << 12 | (z & 15) << 8 | y); } - public static final char tripleBlockCoordChar(int x, int y, int z) { + public static char tripleBlockCoordChar(int x, int y, int z) { return (char) ((x & 15) << 12 | (z & 15) << 8 | y); } - public static final int untripleBlockCoordX(int triple) { + public static int untripleBlockCoordX(int triple) { return (triple >> 12) & 0xF; } - public static final int untripleBlockCoordY(int triple) { + public static int untripleBlockCoordY(int triple) { return (triple & 0xFF); } - public static final int untripleBlockCoordZ(int triple) { + public static int untripleBlockCoordZ(int triple) { return (triple >> 8) & 0xF; } @@ -231,31 +204,27 @@ public class MathMan { return y3 + (y2 << 4) + (y1 << 12); } - public static final long chunkXZ2Int(int x, int z) { - return (long) x & 4294967295L | ((long) z & 4294967295L) << 32; - } - - public static final int unpairIntX(long pair) { + public static int unpairIntX(long pair) { return (int) (pair >> 32); } - public static final int unpairIntY(long pair) { + public static int unpairIntY(long pair) { return (int) pair; } - public static final byte pair16(int x, int y) { + public static byte pair16(int x, int y) { return (byte) (x + (y << 4)); } - public static final byte unpair16x(byte value) { + public static byte unpair16x(byte value) { return (byte) (value & 0xF); } - public static final byte unpair16y(byte value) { + public static byte unpair16y(byte value) { return (byte) ((value >> 4) & 0xF); } - public static final byte pair8(int x, int y) { + public static byte pair8(int x, int y) { return (byte) (x + (y << 3)); } @@ -267,18 +236,14 @@ public class MathMan { return (byte) ((value >> 3) & 0x7F); } - public static final int lossyFastDivide(int a, int b) { - return (a * ((1 << 16) / b)) >> 16; - } - - public static final int gcd(int a, int b) { + public static int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } - public static final int gcd(int[] a) { + public static int gcd(int[] a) { int result = a[0]; for (int i = 1; i < a.length; i++) { result = gcd(result, a[i]); @@ -287,15 +252,7 @@ public class MathMan { } - public static final double getMean(int[] array) { - double count = 0; - for (int i : array) { - count += i; - } - return count / array.length; - } - - public static final double getMean(double[] array) { + public static double getMean(double[] array) { double count = 0; for (double i : array) { count += i; @@ -310,50 +267,24 @@ public class MathMan { * @param pitch * @return */ - public static final float[] getDirection(float yaw, float pitch) { + public static float[] getDirection(float yaw, float pitch) { double pitch_sin = Math.sin(pitch); return new float[]{(float) (pitch_sin * Math.cos(yaw)), (float) (pitch_sin * Math.sin(yaw)), (float) Math.cos(pitch)}; } - public static final int roundInt(double value) { + public static int roundInt(double value) { return (int) (value < 0 ? (value == (int) value) ? value : value - 1 : value); } - /** - * Returns [ pitch, yaw ] - * - * @param x - * @param y - * @param z - * @return - */ - public static final float[] getPitchAndYaw(float x, float y, float z) { - float distance = sqrtApprox((z * z) + (x * x)); - return new float[]{atan2(y, distance), atan2(x, z)}; - } - - public static final float atan2(float y, float x) { - return CachedMathMan.atan2(y, x); - } - - public static final float sqrtApprox(float f) { + public static float sqrtApprox(float f) { return f * Float.intBitsToFloat(0x5f375a86 - (Float.floatToIntBits(f) >> 1)); } - public static final double sqrtApprox(double d) { - return Double.longBitsToDouble(((Double.doubleToLongBits(d) - (1l << 52)) >> 1) + (1l << 61)); + public static double sqrtApprox(double d) { + return Double.longBitsToDouble(((Double.doubleToLongBits(d) - (1L << 52)) >> 1) + (1L << 61)); } - public static final float invSqrt(float x) { - float xhalf = 0.5f * x; - int i = Float.floatToIntBits(x); - i = 0x5f3759df - (i >> 1); - x = Float.intBitsToFloat(i); - x = x * (1.5f - (xhalf * x * x)); - return x; - } - - public static final boolean isInteger(CharSequence str) { + public static boolean isInteger(CharSequence str) { if (str == null) { return false; } @@ -377,41 +308,8 @@ public class MathMan { return true; } - public static final double getSD(double[] array, double av) { - double sd = 0; - for (double element : array) { - sd += Math.pow(Math.abs(element - av), 2); - } - return Math.sqrt(sd / array.length); - } - - public static final double getSD(int[] array, double av) { - double sd = 0; - for (int element : array) { - sd += Math.pow(Math.abs(element - av), 2); - } - return Math.sqrt(sd / array.length); - } - - public static final int absByte(int value) { + public static int absByte(int value) { return (value ^ (value >> 8)) - (value >> 8); } - public static final int mod(int x, int y) { - if (isPowerOfTwo(y)) { - return x & (y - 1); - } - return x % y; - } - - public static final int unsignedmod(int x, int y) { - if (isPowerOfTwo(y)) { - return x & (y - 1); - } - return x % y; - } - - public static final boolean isPowerOfTwo(int x) { - return (x & (x - 1)) == 0; - } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/MemUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/MemUtil.java index 4aa7f465b..496699640 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/MemUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/MemUtil.java @@ -1,6 +1,7 @@ package com.boydti.fawe.util; import com.boydti.fawe.config.Settings; + import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicBoolean; @@ -8,6 +9,8 @@ import java.util.concurrent.atomic.AtomicBoolean; public class MemUtil { private static AtomicBoolean memory = new AtomicBoolean(false); + private static Queue memoryLimitedTasks = new ConcurrentLinkedQueue<>(); + private static Queue memoryPlentifulTasks = new ConcurrentLinkedQueue<>(); public static boolean isMemoryFree() { return !memory.get(); @@ -28,8 +31,7 @@ public class MemUtil { } public static long getUsedBytes() { - long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); - return used; + return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); } public static long getFreeBytes() { @@ -51,17 +53,16 @@ public class MemUtil { return size; } - private static Queue memoryLimitedTasks = new ConcurrentLinkedQueue<>(); - private static Queue memoryPlentifulTasks = new ConcurrentLinkedQueue<>(); - public static void addMemoryLimitedTask(Runnable run) { - if (run != null) + if (run != null) { memoryLimitedTasks.add(run); + } } public static void addMemoryPlentifulTask(Runnable run) { - if (run != null) + if (run != null) { memoryPlentifulTasks.add(run); + } } public static void memoryLimitedTask() { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/Perm.java b/worldedit-core/src/main/java/com/boydti/fawe/util/Perm.java index 84c903bb9..a92b18074 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/Perm.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/Perm.java @@ -16,14 +16,6 @@ public enum Perm { this.cat = cat; } - public boolean has(final FawePlayer player) { - return this.hasPermission(player, this); - } - - public boolean hasPermission(final FawePlayer player, final Perm perm) { - return hasPermission(player, perm.s); - } - public static boolean hasPermission(final FawePlayer player, final String perm) { if ((player == null) || player.hasPermission(ADMIN.s)) { return true; @@ -41,4 +33,12 @@ public enum Perm { } return false; } + + public boolean has(final FawePlayer player) { + return this.hasPermission(player, this); + } + + public boolean hasPermission(final FawePlayer player, final Perm perm) { + return hasPermission(player, perm.s); + } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/RandomTextureUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/RandomTextureUtil.java index 461f760e4..7b93dc410 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/RandomTextureUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/RandomTextureUtil.java @@ -8,14 +8,13 @@ import java.util.concurrent.ThreadLocalRandom; public class RandomTextureUtil extends CachedTextureUtil { - public RandomTextureUtil(TextureUtil parent) throws FileNotFoundException { - super(parent); - } - private int index; private int[] biomeMixBuffer = new int[3]; private Int2ObjectOpenHashMap offsets = new Int2ObjectOpenHashMap<>(); private Int2ObjectOpenHashMap biomeMixes = new Int2ObjectOpenHashMap<>(); + public RandomTextureUtil(TextureUtil parent) throws FileNotFoundException { + super(parent); + } protected int addRandomColor(int c1, int c2) { int red1 = (c1 >> 16) & 0xFF; @@ -50,7 +49,9 @@ public class RandomTextureUtil extends CachedTextureUtil { mix[3] = average; biomeMixes.put(color, mix); } - if (++index > 2) index = 0; + if (++index > 2) { + index = 0; + } int biomeId = mix[index]; int biomeAvColor = mix[3]; int blockColor = getColor(block); @@ -73,7 +74,9 @@ public class RandomTextureUtil extends CachedTextureUtil { mix[3] = average; biomeMixes.put(color, mix); } - if (++index > 2) index = 0; + if (++index > 2) { + index = 0; + } int biomeId = mix[index]; return getBiome(biomeId); } @@ -87,7 +90,9 @@ public class RandomTextureUtil extends CachedTextureUtil { offsetColor = color; } BlockType res = super.getNearestBlock(offsetColor); - if (res == null) return null; + if (res == null) { + return null; + } int newColor = getColor(res); { byte dr = (byte) (((color >> 16) & 0xFF) - ((newColor >> 16) & 0xFF)); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils.java b/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils.java index 8ab6b1cda..5324f24b8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils.java @@ -1,5 +1,9 @@ package com.boydti.fawe.util; +import sun.reflect.ConstructorAccessor; +import sun.reflect.FieldAccessor; +import sun.reflect.ReflectionFactory; + import java.lang.reflect.AccessibleObject; import java.lang.reflect.Array; import java.lang.reflect.Constructor; @@ -7,11 +11,12 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.util.*; - -import sun.reflect.ConstructorAccessor; -import sun.reflect.FieldAccessor; -import sun.reflect.ReflectionFactory; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; /** * @author DPOH-VAR @@ -19,6 +24,8 @@ import sun.reflect.ReflectionFactory; */ @SuppressWarnings({"UnusedDeclaration", "rawtypes"}) public class ReflectionUtils { + private static Class UNMODIFIABLE_MAP = Collections.unmodifiableMap(Collections.EMPTY_MAP).getClass(); + public static T as(Class t, Object o) { return t.isInstance(o) ? t.cast(o) : null; } @@ -52,21 +59,21 @@ public class ReflectionUtils { // 2. Copy it T[] previousValues = (T[]) valuesField.get(enumType); - List values = new ArrayList(Arrays.asList(previousValues)); + List values = new ArrayList<>(Arrays.asList(previousValues)); // 3. build new enum T newValue = (T) makeEnum(enumType, // The target enum class - enumName, // THE NEW ENUM INSTANCE TO BE DYNAMICALLY ADDED - values.size(), - additionalTypes, // can be used to pass values to the enum constructor - additionalValues); // can be used to pass values to the enum constructor + enumName, // THE NEW ENUM INSTANCE TO BE DYNAMICALLY ADDED + values.size(), + additionalTypes, // can be used to pass values to the enum constructor + additionalValues); // can be used to pass values to the enum constructor // 4. add new value values.add(newValue); // 5. Set new values field setFailsafeFieldValue(valuesField, null, - values.toArray((T[]) Array.newInstance(enumType, 0))); + values.toArray((T[]) Array.newInstance(enumType, 0))); // 6. Clean enum cache cleanEnumCache(enumType); @@ -107,7 +114,9 @@ public class ReflectionUtils { Class clazz = dest.getClass(); Object newEnum = makeEnum(clazz, value, dest.ordinal(), additionalTypes, additionalValues); for (Field field : clazz.getDeclaredFields()) { - if (Modifier.isStatic(field.getModifiers())) continue; + if (Modifier.isStatic(field.getModifiers())) { + continue; + } field.setAccessible(true); Object newValue = field.get(newEnum); setField(field, dest, newValue); @@ -118,7 +127,7 @@ public class ReflectionUtils { } public static Object makeEnum(Class enumClass, String value, int ordinal, - Class[] additionalTypes, Object[] additionalValues) throws Exception { + Class[] additionalTypes, Object[] additionalValues) throws Exception { Object[] parms = new Object[additionalValues.length + 2]; parms[0] = value; parms[1] = ordinal; @@ -132,7 +141,7 @@ public class ReflectionUtils { parameterTypes[0] = String.class; parameterTypes[1] = int.class; System.arraycopy(additionalParameterTypes, 0, - parameterTypes, 2, additionalParameterTypes.length); + parameterTypes, 2, additionalParameterTypes.length); return ReflectionFactory.getReflectionFactory().newConstructorAccessor(enumClass.getDeclaredConstructor(parameterTypes)); } @@ -180,12 +189,12 @@ public class ReflectionUtils { blankField(enumClass, "enumConstants"); // IBM JDK } - private static Class UNMODIFIABLE_MAP = Collections.unmodifiableMap(Collections.EMPTY_MAP).getClass(); - public static Map getMap(Map map) { try { Class clazz = map.getClass(); - if (clazz != UNMODIFIABLE_MAP) return map; + if (clazz != UNMODIFIABLE_MAP) { + return map; + } Field m = clazz.getDeclaredField("m"); m.setAccessible(true); return (Map) m.get(map); @@ -198,7 +207,9 @@ public class ReflectionUtils { public static List getList(List list) { try { Class clazz = (Class) Class.forName("java.util.Collections$UnmodifiableList"); - if (!clazz.isInstance(list)) return list; + if (!clazz.isInstance(list)) { + return list; + } Field m = clazz.getDeclaredField("list"); m.setAccessible(true); return (List) m.get(list); @@ -305,19 +316,25 @@ public class ReflectionUtils { if (returnType == null || method.getReturnType() == returnType) { Class[] mp = method.getParameterTypes(); int mods = method.getModifiers(); - if ((mods & hasMods) != hasMods || (mods & noMods) != 0) continue; + if ((mods & hasMods) != hasMods || (mods & noMods) != 0) { + continue; + } if (params == null) { - if (index-- == 0) return setAccessible(method); - else { + if (index-- == 0) { + return setAccessible(method); + } else { continue; } } if (mp.length == params.length) { for (int i = 0; i < mp.length; i++) { - if (mp[i] != params[i]) continue outer; + if (mp[i] != params[i]) { + continue outer; + } } - if (index-- == 0) return setAccessible(method); - else { + if (index-- == 0) { + return setAccessible(method); + } else { continue; } } @@ -438,7 +455,7 @@ public class ReflectionUtils { /** * get existing method by name and types * - * @param name name + * @param name name * @param types method parameters. can be Class or RefClass * @return RefMethod object * @throws RuntimeException if method not found diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils9.java b/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils9.java index 0270b5f16..bb77c7119 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils9.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils9.java @@ -2,7 +2,11 @@ package com.boydti.fawe.util; import sun.misc.Unsafe; -import java.lang.reflect.*; +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -29,12 +33,12 @@ public class ReflectionUtils9 { // 2. Copy it T[] previousValues = (T[]) valuesField.get(enumType); - List values = new ArrayList(Arrays.asList(previousValues)); + List values = new ArrayList<>(Arrays.asList(previousValues)); // 3. build new enum T newValue = (T) makeEnum(enumType, // The target enum class - enumName, // THE NEW ENUM INSTANCE TO BE DYNAMICALLY ADDED - values.size()); // can be used to pass values to the enum constuctor + enumName, // THE NEW ENUM INSTANCE TO BE DYNAMICALLY ADDED + values.size()); // can be used to pass values to the enum constuctor // 4. add new value values.add(newValue); @@ -42,7 +46,7 @@ public class ReflectionUtils9 { // 5. Set new values field try { setFailsafeFieldValue(valuesField, null, - values.toArray((T[]) Array.newInstance(enumType, 0))); + values.toArray((T[]) Array.newInstance(enumType, 0))); } catch (Throwable e) { Field ordinalField = Enum.class.getDeclaredField("ordinal"); setFailsafeFieldValue(ordinalField, newValue, 0); @@ -117,8 +121,11 @@ public class ReflectionUtils9 { } try { - if (target == null) field.set(null, value); - else field.set(target, value); + if (target == null) { + field.set(null, value); + } else { + field.set(target, value); + } } catch (NoSuchMethodError error) { field.set(target, value); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/SetQueue.java b/worldedit-core/src/main/java/com/boydti/fawe/util/SetQueue.java index 28a174870..a7f52b6c2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/SetQueue.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/SetQueue.java @@ -5,6 +5,7 @@ import com.boydti.fawe.config.Settings; import com.boydti.fawe.object.FaweQueue; import com.boydti.fawe.wrappers.WorldWrapper; import com.sk89q.worldedit.world.World; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -21,61 +22,29 @@ public class SetQueue { * The implementation specific queue */ public static final SetQueue IMP = new SetQueue(); - private double targetTPS = 18; - - public enum QueueStage { - INACTIVE, ACTIVE, NONE; - } - private final ConcurrentLinkedDeque activeQueues; private final ConcurrentLinkedDeque inactiveQueues; private final ConcurrentLinkedDeque tasks; - + /** + * A queue of tasks that will run when the queue is empty + */ + private final ConcurrentLinkedDeque emptyTasks = new ConcurrentLinkedDeque<>(); + private double targetTPS = 18; /** * Used to calculate elapsed time in milliseconds and ensure block placement doesn't lag the server */ private long last; private long allocate = 50; private long lastSuccess; - - /** - * A queue of tasks that will run when the queue is empty - */ - private final ConcurrentLinkedDeque emptyTasks = new ConcurrentLinkedDeque<>(); - private ForkJoinPool pool = new ForkJoinPool(); private ExecutorCompletionService completer = new ExecutorCompletionService(pool); - - /** - * @return ForkJoinPool - * @see TaskManager#getPublicForkJoinPool() - */ - @Deprecated - public ExecutorCompletionService getCompleterService() { - return completer; - } - - @Deprecated - public ForkJoinPool getForkJoinPool() { - return pool; - } - - public void runMiscTasks() { - while (Fawe.get().getTimer().isAbove(targetTPS)) { - Runnable task = tasks.poll(); - if (task != null) { - task.run(); - } else { - break; - } - } - } - public SetQueue() { tasks = new ConcurrentLinkedDeque<>(); activeQueues = new ConcurrentLinkedDeque<>(); inactiveQueues = new ConcurrentLinkedDeque<>(); - if (TaskManager.IMP == null) return; + if (TaskManager.IMP == null) { + return; + } TaskManager.IMP.repeat(() -> { try { long now = System.currentTimeMillis(); @@ -170,16 +139,7 @@ public class SetQueue { e.printStackTrace(); } if (pool.getQueuedSubmissionCount() != 0 || pool.getRunningThreadCount() != 0 || pool.getQueuedTaskCount() != 0) { -// if (Fawe.get().isJava8()) - { - pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS); - } -// else { -// pool.shutdown(); -// pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); -// pool = new ForkJoinPool(); -// completer = new ExecutorCompletionService(pool); -// } + pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS); } queue.endSet(parallel); } catch (Throwable e) { @@ -188,6 +148,31 @@ public class SetQueue { }, 1); } + /** + * @return ForkJoinPool + * @see TaskManager#getPublicForkJoinPool() + */ + @Deprecated + public ExecutorCompletionService getCompleterService() { + return completer; + } + + @Deprecated + public ForkJoinPool getForkJoinPool() { + return pool; + } + + public void runMiscTasks() { + while (Fawe.get().getTimer().isAbove(targetTPS)) { + Runnable task = tasks.poll(); + if (task != null) { + task.run(); + } else { + break; + } + } + } + public QueueStage getStage(FaweQueue queue) { return queue.getStage(); } @@ -241,7 +226,9 @@ public class SetQueue { public FaweQueue getNewQueue(World world, boolean fast, boolean autoqueue) { world = WorldWrapper.unwrap(world); - if (world instanceof FaweQueue) return (FaweQueue) world; + if (world instanceof FaweQueue) { + return (FaweQueue) world; + } FaweQueue queue = Fawe.imp().getNewQueue(world, fast); if (autoqueue) { queue.setStage(QueueStage.INACTIVE); @@ -444,4 +431,8 @@ public class SetQueue { } return true; } + + public enum QueueStage { + INACTIVE, ACTIVE, NONE; + } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ShapeInterpolator.java b/worldedit-core/src/main/java/com/boydti/fawe/util/ShapeInterpolator.java index 9d23d38d4..c5753804a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ShapeInterpolator.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/ShapeInterpolator.java @@ -1,7 +1,6 @@ package com.boydti.fawe.util; -import java.awt.Rectangle; -import java.awt.Shape; +import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.FlatteningPathIterator; import java.awt.geom.IllegalPathStateException; @@ -54,53 +53,6 @@ public class ShapeInterpolator { return instance.evaluate(v0, v1, fraction, unionBounds); } - /** - * Creates an interpolated shape from tight bounds. - */ - public Shape evaluate(Shape v0, Shape v1, float fraction) { - return evaluate(v0, v1, fraction, false); - } - - /** - * Creates an interpolated shape. - * - * @param v0 the first shape - * @param v1 the second shape - * @param fraction the fraction from zero (just first shape) to one (just second shape) - * @param unionBounds if `true`, the shape reports bounds which are the union of - * the bounds of both shapes, if `false` it reports "tight" bounds - * using the actual interpolated path. - */ - public Shape evaluate(Shape v0, Shape v1, float fraction, boolean unionBounds) { - if (savedV0 != v0 || savedV1 != v1) { - if (savedV0 == v1 && savedV1 == v0) { - // Just swap the geometries - final Geometry tmp = geom0; - geom0 = geom1; - geom1 = tmp; - } else { - recalculate(v0, v1); - } - savedV0 = v0; - savedV1 = v1; - } - return getShape(fraction, unionBounds); - } - - private void recalculate(Shape v0, Shape v1) { - geom0 = new Geometry(v0); - geom1 = new Geometry(v1); - final float[] tVals0 = geom0.getTVals(); - final float[] tVals1 = geom1.getTVals(); - final float[] masterTVals = mergeTVals(tVals0, tVals1); - geom0.setTVals(masterTVals); - geom1.setTVals(masterTVals); - } - - private Shape getShape(float fraction, boolean unionBounds) { - return new MorphedShape(geom0, geom1, fraction, unionBounds); - } - private static float[] mergeTVals(float[] tVals0, float[] tVals1) { final int count = sortTVals(tVals0, tVals1, null); final float[] newTVals = new float[count]; @@ -138,6 +90,53 @@ public class ShapeInterpolator { return (v0 + ((v1 - v0) * t)); } + /** + * Creates an interpolated shape from tight bounds. + */ + public Shape evaluate(Shape v0, Shape v1, float fraction) { + return evaluate(v0, v1, fraction, false); + } + + /** + * Creates an interpolated shape. + * + * @param v0 the first shape + * @param v1 the second shape + * @param fraction the fraction from zero (just first shape) to one (just second shape) + * @param unionBounds if `true`, the shape reports bounds which are the union of + * the bounds of both shapes, if `false` it reports "tight" bounds + * using the actual interpolated path. + */ + public Shape evaluate(Shape v0, Shape v1, float fraction, boolean unionBounds) { + if (savedV0 != v0 || savedV1 != v1) { + if (savedV0 == v1 && savedV1 == v0) { + // Just swap the geometries + final Geometry tmp = geom0; + geom0 = geom1; + geom1 = tmp; + } else { + recalculate(v0, v1); + } + savedV0 = v0; + savedV1 = v1; + } + return getShape(fraction, unionBounds); + } + + private void recalculate(Shape v0, Shape v1) { + geom0 = new Geometry(v0); + geom1 = new Geometry(v1); + final float[] tVals0 = geom0.getTVals(); + final float[] tVals1 = geom1.getTVals(); + final float[] masterTVals = mergeTVals(tVals0, tVals1); + geom0.setTVals(masterTVals); + geom1.setTVals(masterTVals); + } + + private Shape getShape(float fraction, boolean unionBounds) { + return new MorphedShape(geom0, geom1, fraction, unionBounds); + } + private static class Geometry { static final float THIRD = (1f / 3f); static final float MIN_LEN = 0.001f; @@ -263,8 +262,8 @@ public class ShapeInterpolator { // Copy all coordinates from minPt to the end of the // array to the beginning of the new array System.arraycopy(bezierCoordinates, minPt, - newCoordinates, 0, - numCoordinates - minPt); + newCoordinates, 0, + numCoordinates - minPt); // Now we do not want to copy 0,1 as they are duplicates // of the last 2 coordinates which we just copied. So // we start the source copy at index 2, but we still @@ -273,8 +272,8 @@ public class ShapeInterpolator { // of the array, thus ensuring that thew new array starts // and ends with the same pair of coordinates... System.arraycopy(bezierCoordinates, 2, - newCoordinates, numCoordinates - minPt, - minPt); + newCoordinates, numCoordinates - minPt, + minPt); bezierCoordinates = newCoordinates; } /* Clockwise enforcement: @@ -350,24 +349,24 @@ public class ShapeInterpolator { private void appendLineTo(float x0, float y0, float x1, float y1) { appendCubicTo(// A third of the way from xy0 to xy1: - interp(x0, x1, THIRD), - interp(y0, y1, THIRD), - // A third of the way from xy1 back to xy0: - interp(x1, x0, THIRD), - interp(y1, y0, THIRD), - x1, y1); + interp(x0, x1, THIRD), + interp(y0, y1, THIRD), + // A third of the way from xy1 back to xy0: + interp(x1, x0, THIRD), + interp(y1, y0, THIRD), + x1, y1); } private void appendQuadTo(float x0, float y0, float ctrlX, float ctrlY, float x1, float y1) { appendCubicTo(// A third of the way from ctrl X/Y back to xy0: - interp(ctrlX, x0, THIRD), - interp(ctrlY, y0, THIRD), - // A third of the way from ctrl X/Y to xy1: - interp(ctrlX, x1, THIRD), - interp(ctrlY, y1, THIRD), - x1, y1); + interp(ctrlX, x0, THIRD), + interp(ctrlY, y0, THIRD), + // A third of the way from ctrl X/Y to xy1: + interp(ctrlX, x1, THIRD), + interp(ctrlY, y1, THIRD), + x1, y1); } private void appendCubicTo(float ctrlX1, float ctrlY1, @@ -672,21 +671,21 @@ public class ShapeInterpolator { } /** - * @{inheritDoc} + * @inheritDoc */ public int getWindingRule() { return (t < 0.5 ? g0.getWindingRule() : g1.getWindingRule()); } /** - * @{inheritDoc} + * @inheritDoc */ public boolean isDone() { return (cIndex > g0.getNumCoordinates()); } /** - * @{inheritDoc} + * @inheritDoc */ public void next() { if (cIndex == 0) { @@ -697,7 +696,7 @@ public class ShapeInterpolator { } /** - * @{inheritDoc} + * @inheritDoc */ public int currentSegment(float[] coordinates) { int type; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/StringMan.java b/worldedit-core/src/main/java/com/boydti/fawe/util/StringMan.java index f621d01cd..6ca6bfe66 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/StringMan.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/StringMan.java @@ -1,7 +1,5 @@ package com.boydti.fawe.util; -import com.sk89q.util.StringUtil; - import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; @@ -12,9 +10,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.function.Function; -import java.util.function.IntConsumer; -import java.util.function.IntFunction; -import java.util.function.Predicate; public class StringMan { public static String replaceFromMap(final String string, final Map replacements) { @@ -40,7 +35,9 @@ public class StringMan { public static boolean containsAny(CharSequence sequence, String any) { for (int i = 0; i < sequence.length(); i++) { - if (any.indexOf(sequence.charAt(i)) != -1) return true; + if (any.indexOf(sequence.charAt(i)) != -1) { + return true; + } } return false; } @@ -48,7 +45,9 @@ public class StringMan { public static int findMatchingBracket(CharSequence sequence, int index) { char startC = sequence.charAt(index); char lookC = getMatchingBracket(startC); - if (lookC == startC) return -1; + if (lookC == startC) { + return -1; + } boolean forward = isBracketForwards(startC); int increment = forward ? 1 : -1; int end = forward ? sequence.length() : -1; @@ -65,10 +64,17 @@ public class StringMan { } public static String prettyFormat(double d) { - if (d == Double.MIN_VALUE) return "-∞"; - if (d == Double.MAX_VALUE) return "∞"; - if(d == (long) d) return String.format("%d",(long)d); - else return String.format("%s",d); + if (d == Double.MIN_VALUE) { + return "-∞"; + } + if (d == Double.MAX_VALUE) { + return "∞"; + } + if (d == (long) d) { + return String.format("%d", (long) d); + } else { + return String.format("%s", d); + } } public static boolean isBracketForwards(char c) { @@ -78,21 +84,31 @@ public class StringMan { case '{': case '<': return true; - default: return false; + default: + return false; } } public static char getMatchingBracket(char c) { switch (c) { - case '[': return ']'; - case '(': return ')'; - case '{': return '}'; - case '<': return '>'; - case ']': return '['; - case ')': return '('; - case '}': return '{'; - case '>': return '<'; - default: return c; + case '[': + return ']'; + case '(': + return ')'; + case '{': + return '}'; + case '<': + return '>'; + case ']': + return '['; + case ')': + return '('; + case '}': + return '{'; + case '>': + return '<'; + default: + return c; } } @@ -139,7 +155,9 @@ public class StringMan { public static int indexOf(String input, int start, char... values) { for (int i = start; i < input.length(); i++) { for (char c : values) { - if (c == input.charAt(i)) return i; + if (c == input.charAt(i)) { + return i; + } } } return -1; @@ -158,11 +176,15 @@ public class StringMan { for (int current = 0; current < input.length(); current++) { char currentChar = input.charAt(current); boolean atLastChar = (current == input.length() - 1); - if (!atLastChar && (bracket > 0 || (currentChar == '{' && ++bracket > 0) || (current == '}' && --bracket <= 0))) + if (!atLastChar && (bracket > 0 || (currentChar == '{' && ++bracket > 0) || (current == '}' && --bracket <= 0))) { continue; - if (currentChar == '\"') inQuotes = !inQuotes; // toggle state - if (atLastChar) result.add(input.substring(start)); - else if (currentChar == delim && !inQuotes) { + } + if (currentChar == '\"') { + inQuotes = !inQuotes; // toggle state + } + if (atLastChar) { + result.add(input.substring(start)); + } else if (currentChar == delim && !inQuotes) { String toAdd = input.substring(start, current); if (toAdd.startsWith("\"")) { toAdd = toAdd.substring(1, toAdd.length() - 1); @@ -347,7 +369,9 @@ public class StringMan { char ai = input.charAt(i); outer: while (true) { - if (j >= item.length()) return Integer.MAX_VALUE; + if (j >= item.length()) { + return Integer.MAX_VALUE; + } char bj = item.charAt(j++); if (sequentail) { @@ -355,7 +379,9 @@ public class StringMan { case ':': case '_': sequentail = false; - if (bj == ai) break outer; + if (bj == ai) { + break outer; + } continue; } continue; @@ -455,8 +481,9 @@ public class StringMan { if (char0 == '-') { negative = true; start++; + } else { + negative = false; } - else negative = false; for (int i = start; i < end; i++) { char c = string.charAt(i); switch (c) { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/TaskManager.java b/worldedit-core/src/main/java/com/boydti/fawe/util/TaskManager.java index 368853e91..cb29f84e3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/TaskManager.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/TaskManager.java @@ -6,13 +6,13 @@ import com.boydti.fawe.object.FaweQueue; import com.boydti.fawe.object.RunnableVal; import org.jetbrains.annotations.NotNull; +import javax.annotation.Nullable; import java.util.Collection; import java.util.Iterator; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; -import javax.annotation.Nullable; public abstract class TaskManager { @@ -78,7 +78,7 @@ public abstract class TaskManager { /** * Run a bunch of tasks in parallel * - * @param runnables The tasks to run + * @param runnables The tasks to run * @param numThreads Number of threads (null = config.yml parallel threads) */ @Deprecated @@ -228,8 +228,8 @@ public abstract class TaskManager { * Break up a task and run it in fragments of 5ms.
* - Each task will run on the main thread.
* - * @param objects - The list of objects to run the task for - * @param task - The task to run on each object + * @param objects - The list of objects to run the task for + * @param task - The task to run on each object * @param whenDone - When the object task completes * @param */ @@ -312,7 +312,7 @@ public abstract class TaskManager { * - Usualy wait time is around 25ms
* * @param function - * @param timeout - How long to wait for execution + * @param timeout - How long to wait for execution * @param * @return */ @@ -361,7 +361,7 @@ public abstract class TaskManager { * - Usualy wait time is around 25ms
* * @param function - * @param timeout - How long to wait for execution + * @param timeout - How long to wait for execution * @param * @return */ diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/TextureUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/TextureUtil.java index 84d3af4ad..d97a4f272 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/TextureUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/TextureUtil.java @@ -1,25 +1,19 @@ package com.boydti.fawe.util; import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; import com.boydti.fawe.config.Settings; import com.boydti.fawe.object.pattern.PatternExtent; import com.boydti.fawe.util.image.ImageUtil; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; - -import com.sk89q.worldedit.util.command.binding.Text; -import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.pattern.BlockPattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.registry.BlockMaterial; -import com.sk89q.worldedit.world.registry.BundledBlockData; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.IntArraySet; @@ -27,19 +21,330 @@ import it.unimi.dsi.fastutil.longs.LongArrayList; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; -import java.io.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; // TODO FIXME -public class TextureUtil implements TextureHolder { +public class +TextureUtil implements TextureHolder { + + private static final int[] FACTORS = new int[766]; + + static { + for (int i = 1; i < FACTORS.length; i++) { + FACTORS[i] = 65535 / i; + } + } + + private final File folder; + protected int[] blockColors = new int[BlockTypes.size()]; + protected long[] blockDistance = new long[BlockTypes.size()]; + protected long[] distances; + protected int[] validColors; + protected int[] validBlockIds; + protected int[] validLayerColors; + protected int[][] validLayerBlocks; + protected int[] validMixBiomeColors; + protected long[] validMixBiomeIds; + /** + * https://github.com/erich666/Mineways/blob/master/Win/biomes.cpp + */ + protected BiomeColor[] validBiomes; + private BiomeColor[] biomes = new BiomeColor[]{ + // ID Name Temperature, rainfall, grass, foliage colors + // - note: the colors here are just placeholders, they are computed in the program + new BiomeColor(0, "Ocean", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), + // default values of temp and rain + new BiomeColor(1, "Plains", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(2, "Desert", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(3, "Extreme Hills", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), + new BiomeColor(4, "Forest", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(5, "Taiga", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(6, "Swampland", 0.8f, 0.9f, 0x92BD59, 0x77AB2F), + new BiomeColor(7, "River", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), + // default values of temp and rain + new BiomeColor(8, "Nether", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(9, "End", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), + // default values of temp and rain + new BiomeColor(10, "Frozen Ocean", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), + new BiomeColor(11, "Frozen River", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), + new BiomeColor(12, "Ice Plains", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), + new BiomeColor(13, "Ice Mountains", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), + new BiomeColor(14, "Mushroom Island", 0.9f, 1.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(15, "Mushroom Island Shore", 0.9f, 1.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(16, "Beach", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(17, "Desert Hills", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(18, "Forest Hills", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(19, "Taiga Hills", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(20, "Extreme Hills Edge", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), + new BiomeColor(21, "Jungle", 0.95f, 0.9f, 0x92BD59, 0x77AB2F), + new BiomeColor(22, "Jungle Hills", 0.95f, 0.9f, 0x92BD59, 0x77AB2F), + new BiomeColor(23, "Jungle Edge", 0.95f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(24, "Deep Ocean", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), + new BiomeColor(25, "Stone Beach", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), + new BiomeColor(26, "Cold Beach", 0.05f, 0.3f, 0x92BD59, 0x77AB2F), + new BiomeColor(27, "Birch Forest", 0.6f, 0.6f, 0x92BD59, 0x77AB2F), + new BiomeColor(28, "Birch Forest Hills", 0.6f, 0.6f, 0x92BD59, 0x77AB2F), + new BiomeColor(29, "Roofed Forest", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(30, "Cold Taiga", -0.5f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(31, "Cold Taiga Hills", -0.5f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(32, "Mega Taiga", 0.3f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(33, "Mega Taiga Hills", 0.3f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(34, "Extreme Hills+", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), + new BiomeColor(35, "Savanna", 1.2f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(36, "Savanna Plateau", 1.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(37, "Mesa", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(38, "Mesa Plateau F", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(39, "Mesa Plateau", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(40, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(41, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(42, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(43, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(44, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(45, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(46, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(47, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(48, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(49, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(50, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(51, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(52, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(53, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(54, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(55, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(56, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(57, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(58, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(59, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(60, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(61, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(62, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(63, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(64, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(65, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(66, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(67, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(68, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(69, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(70, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(71, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(72, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(73, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(74, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(75, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(76, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(77, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(78, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(79, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(80, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(81, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(82, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(83, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(84, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(85, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(86, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(87, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(88, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(89, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(90, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(91, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(92, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(93, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(94, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(95, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(96, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(97, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(98, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(99, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(100, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(101, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(102, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(103, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(104, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(105, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(106, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(107, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(108, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(109, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(110, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(111, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(112, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(113, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(114, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(115, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(116, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(117, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(118, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(119, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(120, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(121, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(122, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(123, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(124, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(125, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(126, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(127, "The Void", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), + // default values of temp and rain; also, no height differences + new BiomeColor(128, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(129, "Sunflower Plains", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(130, "Desert M", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(131, "Extreme Hills M", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), + new BiomeColor(132, "Flower Forest", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(133, "Taiga M", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(134, "Swampland M", 0.8f, 0.9f, 0x92BD59, 0x77AB2F), + new BiomeColor(135, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(136, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(137, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(138, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(139, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(140, "Ice Plains Spikes", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), + new BiomeColor(141, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(142, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(143, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(144, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(145, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(146, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(147, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(148, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(149, "Jungle M", 0.95f, 0.9f, 0x92BD59, 0x77AB2F), + new BiomeColor(150, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(151, "JungleEdge M", 0.95f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(152, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(153, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(154, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(155, "Birch Forest M", 0.6f, 0.6f, 0x92BD59, 0x77AB2F), + new BiomeColor(156, "Birch Forest Hills M", 0.6f, 0.6f, 0x92BD59, 0x77AB2F), + new BiomeColor(157, "Roofed Forest M", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(158, "Cold Taiga M", -0.5f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(159, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(160, "Mega Spruce Taiga", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), + // special exception, temperature not 0.3 + new BiomeColor(161, "Mega Spruce Taiga Hills", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), + new BiomeColor(162, "Extreme Hills+ M", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), + new BiomeColor(163, "Savanna M", 1.1f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(164, "Savanna Plateau M", 1.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(165, "Mesa (Bryce)", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(166, "Mesa Plateau F M", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(167, "Mesa Plateau M", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), + new BiomeColor(168, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(169, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(170, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(171, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(172, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(173, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(174, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(175, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(176, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(177, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(178, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(179, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(180, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(181, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(182, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(183, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(184, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(185, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(186, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(187, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(188, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(189, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(190, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(191, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(192, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(193, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(194, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(195, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(196, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(197, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(198, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(199, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(200, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(201, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(202, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(203, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(204, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(205, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(206, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(207, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(208, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(209, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(210, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(211, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(212, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(213, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(214, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(215, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(216, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(217, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(218, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(219, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(220, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(221, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(222, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(223, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(224, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(225, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(226, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(227, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(228, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(229, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(230, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(231, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(232, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(233, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(234, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(235, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(236, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(237, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(238, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(239, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(240, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(241, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(242, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(243, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(244, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(245, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(246, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(247, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(248, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(249, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(250, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(251, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(252, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(253, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(254, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), + new BiomeColor(255, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F),}; + private BlockType[] layerBuffer = new BlockType[2]; + public TextureUtil() throws FileNotFoundException { + this(MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.TEXTURES)); + } + + public TextureUtil(File folder) throws FileNotFoundException { + this.folder = folder; + if (!folder.exists()) { + throw new FileNotFoundException( + "Please create a `FastAsyncWorldEdit/textures` folder with `.minecraft/versions` jar or mods in it."); + } + } public static TextureUtil fromClipboard(Clipboard clipboard) throws FileNotFoundException { boolean[] ids = new boolean[BlockTypes.size()]; @@ -75,312 +380,25 @@ public class TextureUtil implements TextureHolder { return fromBlocks(blocks); } + protected static int hueDistance(int red1, int green1, int blue1, int red2, int green2, + int blue2) { + int total1 = (red1 + green1 + blue1); + int total2 = (red2 + green2 + blue2); + if (total1 == 0 || total2 == 0) { + return 0; + } + int factor1 = FACTORS[total1]; + int factor2 = FACTORS[total2]; + long r = (512 * (red1 * factor1 - red2 * factor2)) >> 10; + long g = (green1 * factor1 - green2 * factor2); + long b = (767 * (blue1 * factor1 - blue2 * factor2)) >> 10; + return (int) ((r * r + g * g + b * b) >> 25); + } + @Override public TextureUtil getTextureUtil() { return this; } - private final File folder; - private static final int[] FACTORS = new int[766]; - - static { - for (int i = 1; i < FACTORS.length; i++) { - FACTORS[i] = 65535 / i; - } - } - - protected int[] blockColors = new int[BlockTypes.size()]; - protected long[] blockDistance = new long[BlockTypes.size()]; - protected long[] distances; - protected int[] validColors; - protected int[] validBlockIds; - - protected int[] validLayerColors; - protected int[][] validLayerBlocks; - - protected int[] validMixBiomeColors; - protected long[] validMixBiomeIds; - - /** - * https://github.com/erich666/Mineways/blob/master/Win/biomes.cpp - */ - protected BiomeColor[] validBiomes; - private BiomeColor[] biomes = new BiomeColor[] { - // ID Name Temperature, rainfall, grass, foliage colors - // - note: the colors here are just placeholders, they are computed in the program - new BiomeColor(0, "Ocean", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), - // default values of temp and rain - new BiomeColor(1, "Plains", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(2, "Desert", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(3, "Extreme Hills", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), - new BiomeColor(4, "Forest", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(5, "Taiga", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(6, "Swampland", 0.8f, 0.9f, 0x92BD59, 0x77AB2F), - new BiomeColor(7, "River", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), - // default values of temp and rain - new BiomeColor(8, "Nether", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(9, "End", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), - // default values of temp and rain - new BiomeColor(10, "Frozen Ocean", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), - new BiomeColor(11, "Frozen River", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), - new BiomeColor(12, "Ice Plains", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), - new BiomeColor(13, "Ice Mountains", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), - new BiomeColor(14, "Mushroom Island", 0.9f, 1.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(15, "Mushroom Island Shore", 0.9f, 1.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(16, "Beach", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(17, "Desert Hills", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(18, "Forest Hills", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(19, "Taiga Hills", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(20, "Extreme Hills Edge", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), - new BiomeColor(21, "Jungle", 0.95f, 0.9f, 0x92BD59, 0x77AB2F), - new BiomeColor(22, "Jungle Hills", 0.95f, 0.9f, 0x92BD59, 0x77AB2F), - new BiomeColor(23, "Jungle Edge", 0.95f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(24, "Deep Ocean", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), - new BiomeColor(25, "Stone Beach", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), - new BiomeColor(26, "Cold Beach", 0.05f, 0.3f, 0x92BD59, 0x77AB2F), - new BiomeColor(27, "Birch Forest", 0.6f, 0.6f, 0x92BD59, 0x77AB2F), - new BiomeColor(28, "Birch Forest Hills", 0.6f, 0.6f, 0x92BD59, 0x77AB2F), - new BiomeColor(29, "Roofed Forest", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(30, "Cold Taiga", -0.5f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(31, "Cold Taiga Hills", -0.5f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(32, "Mega Taiga", 0.3f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(33, "Mega Taiga Hills", 0.3f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(34, "Extreme Hills+", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), - new BiomeColor(35, "Savanna", 1.2f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(36, "Savanna Plateau", 1.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(37, "Mesa", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(38, "Mesa Plateau F", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(39, "Mesa Plateau", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(40, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(41, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(42, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(43, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(44, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(45, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(46, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(47, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(48, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(49, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(50, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(51, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(52, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(53, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(54, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(55, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(56, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(57, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(58, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(59, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(60, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(61, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(62, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(63, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(64, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(65, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(66, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(67, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(68, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(69, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(70, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(71, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(72, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(73, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(74, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(75, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(76, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(77, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(78, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(79, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(80, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(81, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(82, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(83, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(84, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(85, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(86, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(87, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(88, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(89, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(90, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(91, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(92, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(93, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(94, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(95, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(96, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(97, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(98, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(99, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(100, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(101, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(102, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(103, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(104, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(105, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(106, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(107, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(108, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(109, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(110, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(111, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(112, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(113, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(114, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(115, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(116, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(117, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(118, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(119, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(120, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(121, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(122, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(123, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(124, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(125, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(126, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(127, "The Void", 0.5f, 0.5f, 0x92BD59, 0x77AB2F), - // default values of temp and rain; also, no height differences - new BiomeColor(128, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(129, "Sunflower Plains", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(130, "Desert M", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(131, "Extreme Hills M", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), - new BiomeColor(132, "Flower Forest", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(133, "Taiga M", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(134, "Swampland M", 0.8f, 0.9f, 0x92BD59, 0x77AB2F), - new BiomeColor(135, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(136, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(137, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(138, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(139, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(140, "Ice Plains Spikes", 0.0f, 0.5f, 0x92BD59, 0x77AB2F), - new BiomeColor(141, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(142, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(143, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(144, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(145, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(146, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(147, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(148, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(149, "Jungle M", 0.95f, 0.9f, 0x92BD59, 0x77AB2F), - new BiomeColor(150, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(151, "JungleEdge M", 0.95f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(152, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(153, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(154, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(155, "Birch Forest M", 0.6f, 0.6f, 0x92BD59, 0x77AB2F), - new BiomeColor(156, "Birch Forest Hills M", 0.6f, 0.6f, 0x92BD59, 0x77AB2F), - new BiomeColor(157, "Roofed Forest M", 0.7f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(158, "Cold Taiga M", -0.5f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(159, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(160, "Mega Spruce Taiga", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), - // special exception, temperature not 0.3 - new BiomeColor(161, "Mega Spruce Taiga Hills", 0.25f, 0.8f, 0x92BD59, 0x77AB2F), - new BiomeColor(162, "Extreme Hills+ M", 0.2f, 0.3f, 0x92BD59, 0x77AB2F), - new BiomeColor(163, "Savanna M", 1.1f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(164, "Savanna Plateau M", 1.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(165, "Mesa (Bryce)", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(166, "Mesa Plateau F M", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(167, "Mesa Plateau M", 2.0f, 0.0f, 0x92BD59, 0x77AB2F), - new BiomeColor(168, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(169, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(170, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(171, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(172, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(173, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(174, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(175, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(176, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(177, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(178, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(179, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(180, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(181, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(182, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(183, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(184, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(185, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(186, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(187, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(188, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(189, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(190, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(191, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(192, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(193, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(194, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(195, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(196, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(197, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(198, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(199, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(200, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(201, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(202, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(203, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(204, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(205, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(206, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(207, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(208, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(209, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(210, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(211, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(212, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(213, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(214, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(215, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(216, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(217, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(218, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(219, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(220, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(221, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(222, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(223, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(224, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(225, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(226, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(227, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(228, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(229, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(230, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(231, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(232, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(233, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(234, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(235, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(236, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(237, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(238, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(239, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(240, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(241, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(242, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(243, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(244, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(245, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(246, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(247, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(248, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(249, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(250, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(251, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(252, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(253, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(254, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F), - new BiomeColor(255, "Unknown Biome", 0.8f, 0.4f, 0x92BD59, 0x77AB2F),}; - - public TextureUtil() throws FileNotFoundException { - this(MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.TEXTURES)); - } - - public TextureUtil(File folder) throws FileNotFoundException { - this.folder = folder; - if (!folder.exists()) { - throw new FileNotFoundException( - "Please create a `FastAsyncWorldEdit/textures` folder with `.minecraft/versions` jar or mods in it."); - } - } - public BlockType getNearestBlock(int color) { long min = Long.MAX_VALUE; int closest = 0; @@ -435,8 +453,6 @@ public class TextureUtil implements TextureHolder { return BlockTypes.get(closest); } - private BlockType[] layerBuffer = new BlockType[2]; - /** * Returns the block combined ids as an array * @@ -482,14 +498,14 @@ public class TextureUtil implements TextureHolder { } public boolean getIsBlockCloserThanBiome(int[] blockAndBiomeIdOutput, int color, - int biomePriority) { + int biomePriority) { BlockType block = getNearestBlock(color); TextureUtil.BiomeColor biome = getNearestBiome(color); int blockColor = getColor(block); blockAndBiomeIdOutput[0] = block.getInternalId(); blockAndBiomeIdOutput[1] = biome.id; if (colorDistance(biome.grassCombined, color) - biomePriority > colorDistance(blockColor, - color)) { + color)) { return true; } return false; @@ -589,7 +605,7 @@ public class TextureUtil implements TextureHolder { } if (files.length == 0) { Fawe.debug( - "Please create a `FastAsyncWorldEdit/textures` folder with `.minecraft/versions/1.13.jar` jar or mods in it. If the file exists, please make sure the server has read access to the directory"); + "Please create a `FastAsyncWorldEdit/textures` folder with `.minecraft/versions/1.13.jar` jar or mods in it. If the file exists, please make sure the server has read access to the directory"); } else { for (File file : files) { ZipFile zipFile = new ZipFile(file); @@ -606,7 +622,7 @@ public class TextureUtil implements TextureHolder { Path path = Paths.get(name); if (path.startsWith("assets" + File.separator)) { String[] split = - path.toString().split(Pattern.quote(File.separator)); + path.toString().split(Pattern.quote(File.separator)); if (split.length > 1) { String modId = split[1]; mods.add(modId); @@ -643,7 +659,7 @@ public class TextureUtil implements TextureHolder { String textureFileName; try (InputStream is = zipFile.getInputStream(entry)) { JsonReader reader = new JsonReader( - new InputStreamReader(is, StandardCharsets.UTF_8)); + new InputStreamReader(is, StandardCharsets.UTF_8)); Map root = gson.fromJson(reader, typeToken); Map textures = (Map) root.get("textures"); @@ -653,7 +669,7 @@ public class TextureUtil implements TextureHolder { Set models = new HashSet<>(); // Get models for (Map.Entry stringObjectEntry : textures - .entrySet()) { + .entrySet()) { Object value = stringObjectEntry.getValue(); if (value instanceof String) { models.add((String) value); @@ -669,7 +685,7 @@ public class TextureUtil implements TextureHolder { } textureFileName = - String.format(texturesDir, nameSpace, models.iterator().next()); + String.format(texturesDir, nameSpace, models.iterator().next()); } BufferedImage image = readImage(zipFile, textureFileName); @@ -687,7 +703,7 @@ public class TextureUtil implements TextureHolder { Integer grass = null; { String grassFileName = - String.format(texturesDir, "minecraft", "grass_block_top"); + String.format(texturesDir, "minecraft", "grass_block_top"); BufferedImage image = readImage(zipFile, grassFileName); if (image != null) { grass = ImageUtil.getColor(image); @@ -696,16 +712,16 @@ public class TextureUtil implements TextureHolder { if (grass != null) { // assets\minecraft\textures\colormap ZipEntry grassEntry = getEntry(zipFile, - "assets/minecraft/textures/colormap/grass_block.png"); + "assets/minecraft/textures/colormap/grass_block.png"); if (grassEntry != null) { try (InputStream is = zipFile.getInputStream(grassEntry)) { BufferedImage image = ImageIO.read(is); // Update biome colors for (BiomeColor biome : biomes) { float adjTemp = - MathMan.clamp(biome.temperature, 0.0f, 1.0f); + MathMan.clamp(biome.temperature, 0.0f, 1.0f); float adjRainfall = - MathMan.clamp(biome.rainfall, 0.0f, 1.0f) * adjTemp; + MathMan.clamp(biome.rainfall, 0.0f, 1.0f) * adjTemp; int x = (int) (255 - adjTemp * 255); int z = (int) (255 - adjRainfall * 255); biome.grass = image.getRGB(x, z); @@ -716,9 +732,10 @@ public class TextureUtil implements TextureHolder { biomes[134].grass = 0; // roofed forest: averaged w/ 0x28340A biomes[29].grass = - multiplyColor(biomes[29].grass, 0x28340A + (255 << 24)); + //TODO the following expressions will always overflow because they will be bigger than MAX_INT + multiplyColor(biomes[29].grass, 0x28340A + (255 << 24)); biomes[157].grass = - multiplyColor(biomes[157].grass, 0x28340A + (255 << 24)); + multiplyColor(biomes[157].grass, 0x28340A + (255 << 24)); // mesa : 0x90814D biomes[37].grass = 0x90814D + (255 << 24); biomes[38].grass = 0x90814D + (255 << 24); @@ -730,12 +747,12 @@ public class TextureUtil implements TextureHolder { for (BiomeColor biome : biomes) { // biome.grass = multiplyColor(biome.grass, grass); if (biome.grass != 0 && !biome.name - .equalsIgnoreCase("Unknown Biome")) { + .equalsIgnoreCase("Unknown Biome")) { valid.add(biome); } biome.grassCombined = multiplyColor(grass, biome.grass); } - this.validBiomes = valid.toArray(new BiomeColor[valid.size()]); + this.validBiomes = valid.toArray(new BiomeColor[0]); { ArrayList uniqueColors = new ArrayList<>(); @@ -758,13 +775,13 @@ public class TextureUtil implements TextureHolder { BiomeColor c2 = uniqueColors.get(j); BiomeColor c3 = uniqueColors.get(k); int average = - averageColor(c1.grass, c2.grass, c3.grass); + averageColor(c1.grass, c2.grass, c3.grass); if (uniqueBiomesColors.add(average)) { count++; layerColors.add((long) average); layerIds.add( - (long) ((c1.id) + (c2.id << 8) + (c3.id - << 16))); + (long) ((c1.id) + (c2.id << 8) + (c3.id + << 16))); } } } @@ -889,7 +906,7 @@ public class TextureUtil implements TextureHolder { if (!hasAlpha(colorOther)) { int combinedOther = validBlockIds[j]; int combinedColor = combineTransparency(color, colorOther); - colorLayerMap.put(combinedColor, new int[] {combined, combinedOther}); + colorLayerMap.put(combinedColor, new int[]{combined, combinedOther}); } } } @@ -974,22 +991,7 @@ public class TextureUtil implements TextureHolder { int b = blue1 - blue2; int hd = hueDistance(red1, green1, blue1, red2, green2, blue2); return (((512 + rmean) * r * r) >> 8) + 4 * g * g + (((767 - rmean) * b * b) >> 8) + (hd - * hd); - } - - protected static int hueDistance(int red1, int green1, int blue1, int red2, int green2, - int blue2) { - int total1 = (red1 + green1 + blue1); - int total2 = (red2 + green2 + blue2); - if (total1 == 0 || total2 == 0) { - return 0; - } - int factor1 = FACTORS[total1]; - int factor2 = FACTORS[total2]; - long r = (512 * (red1 * factor1 - red2 * factor2)) >> 10; - long g = (green1 * factor1 - green2 * factor2); - long b = (767 * (blue1 * factor1 - blue2 * factor2)) >> 10; - return (int) ((r * r + g * g + b * b) >> 25); + * hd); } public long getDistance(BufferedImage image, int c1) { @@ -1010,6 +1012,10 @@ public class TextureUtil implements TextureHolder { return totalDistSqr / area; } + public int[] getValidBlockIds() { + return validBlockIds.clone(); + } + public static class BiomeColor { public int id; public String name; @@ -1020,7 +1026,7 @@ public class TextureUtil implements TextureHolder { public int foliage; public BiomeColor(int id, String name, float temperature, float rainfall, int grass, - int foliage) { + int foliage) { this.id = id; this.name = name; this.temperature = temperature; @@ -1030,8 +1036,4 @@ public class TextureUtil implements TextureHolder { this.foliage = foliage; } } - - public int[] getValidBlockIds() { - return validBlockIds.clone(); - } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/WEManager.java b/worldedit-core/src/main/java/com/boydti/fawe/util/WEManager.java index 1b315f004..0f83a7be5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/WEManager.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/WEManager.java @@ -14,9 +14,12 @@ import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; + import java.lang.reflect.Field; -import java.util.*; -import java.util.stream.Collectors; +import java.util.ArrayDeque; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; public class WEManager { @@ -124,7 +127,9 @@ public class WEManager { } } } - if (!removed) return regions.toArray(new Region[0]); + if (!removed) { + return regions.toArray(new Region[0]); + } masks.clear(); } } @@ -132,12 +137,16 @@ public class WEManager { for (final FaweMaskManager manager : managers) { if (player.hasPermission("fawe." + manager.getKey())) { try { - if (manager.isExclusive() && !masks.isEmpty()) continue; + if (manager.isExclusive() && !masks.isEmpty()) { + continue; + } final FaweMask mask = manager.getMask(player, FaweMaskManager.MaskType.getDefaultMaskType()); if (mask != null) { regions.add(mask.getRegion()); masks.add(mask); - if (manager.isExclusive()) break; + if (manager.isExclusive()) { + break; + } } } catch (Throwable e) { e.printStackTrace(); @@ -155,10 +164,10 @@ public class WEManager { public boolean intersects(final Region region1, final Region region2) { - BlockVector3 rg1P1 = region1.getMinimumPoint(); - BlockVector3 rg1P2 = region1.getMaximumPoint(); - BlockVector3 rg2P1 = region2.getMinimumPoint(); - BlockVector3 rg2P2 = region2.getMaximumPoint(); + BlockVector3 rg1P1 = region1.getMinimumPoint(); + BlockVector3 rg1P2 = region1.getMaximumPoint(); + BlockVector3 rg2P1 = region2.getMinimumPoint(); + BlockVector3 rg2P2 = region2.getMaximumPoint(); return (rg1P1.getBlockX() <= rg2P2.getBlockX()) && (rg1P2.getBlockX() >= rg2P1.getBlockX()) && (rg1P1.getBlockZ() <= rg2P2.getBlockZ()) && (rg1P2.getBlockZ() >= rg2P1.getBlockZ()); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/chat/Message.java b/worldedit-core/src/main/java/com/boydti/fawe/util/chat/Message.java index 46a74b7f1..997654b06 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/chat/Message.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/chat/Message.java @@ -5,6 +5,7 @@ import com.boydti.fawe.config.BBC; import com.boydti.fawe.object.FawePlayer; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Actor; + import java.util.Objects; public class Message { @@ -97,9 +98,11 @@ public class Message { public Message cmdOptions(String prefix, String suffix, String... options) { for (int i = 0; i < options.length; i++) { - if (i != 0) text(" &8|&7 "); + if (i != 0) { + text(" &8|&7 "); + } text("&7[&a" + options[i] + "&7]") - .cmdTip(prefix + options[i] + suffix); + .cmdTip(prefix + options[i] + suffix); } return this; } @@ -132,10 +135,10 @@ public class Message { } if (page < totalPages && page > 1) { // Back | Next this.text("&f<<").command(baseCommand + " " + (page - 1)).text("&8 | ").text("&f>>") - .command(baseCommand + " " + (page + 1)); + .command(baseCommand + " " + (page + 1)); } else if (page <= 1 && totalPages > page) { // Next this.text("&8 -").text(" | ").text("&f>>") - .command(baseCommand + " " + (page + 1)); + .command(baseCommand + " " + (page + 1)); } else if (page == totalPages && totalPages > 1) { // Back this.text("&f<<").command(baseCommand + " " + (page - 1)).text("&8 | ").text("- "); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/chat/PlainChatManager.java b/worldedit-core/src/main/java/com/boydti/fawe/util/chat/PlainChatManager.java index d39fd2228..f3e2f2694 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/chat/PlainChatManager.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/chat/PlainChatManager.java @@ -3,6 +3,7 @@ package com.boydti.fawe.util.chat; import com.boydti.fawe.config.BBC; import com.boydti.fawe.object.FawePlayer; + import java.util.ArrayList; import java.util.List; @@ -20,10 +21,12 @@ public class PlainChatManager implements ChatManager> { } @Override - public void tooltip(Message message, Message... tooltips) {} + public void tooltip(Message message, Message... tooltips) { + } @Override - public void command(Message message, String command) {} + public void command(Message message, String command) { + } @Override public void text(Message message, String text) { @@ -40,8 +43,10 @@ public class PlainChatManager implements ChatManager> { } @Override - public void suggest(Message plotMessage, String command) {} + public void suggest(Message plotMessage, String command) { + } @Override - public void link(Message message, String url) {} -} \ No newline at end of file + public void link(Message message, String url) { + } +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/chat/UsageMessage.java b/worldedit-core/src/main/java/com/boydti/fawe/util/chat/UsageMessage.java index 313bb6275..9c26d2921 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/chat/UsageMessage.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/chat/UsageMessage.java @@ -15,11 +15,11 @@ import com.sk89q.worldedit.util.command.Parameter; import com.sk89q.worldedit.util.command.PrimaryAliasComparator; import com.sk89q.worldedit.util.command.binding.Range; import com.sk89q.worldedit.util.command.parametric.ParameterData; + +import javax.annotation.Nullable; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nullable; - import static com.google.common.base.Preconditions.checkNotNull; @@ -27,7 +27,7 @@ public class UsageMessage extends Message { /** * Create a new usage box. * - * @param command the command to describe + * @param command the command to describe * @param commandString the command that was used, such as "/we" or "/brush sphere" */ public UsageMessage(CommandCallable command, String commandString) { @@ -37,9 +37,9 @@ public class UsageMessage extends Message { /** * Create a new usage box. * - * @param command the command to describe + * @param command the command to describe * @param commandString the command that was used, such as "/we" or "/brush sphere" - * @param locals list of locals to use + * @param locals list of locals to use */ public UsageMessage(CommandCallable command, String commandString, @Nullable CommandLocals locals) { checkNotNull(command); @@ -85,12 +85,14 @@ public class UsageMessage extends Message { String arg; if (param.getFlag() != null) { arg = "-" + param.getFlag(); - if (param.isValueFlag()) + if (param.isValueFlag()) { arg += param.getName(); + } } else { arg = param.getName(); - if (param.getDefaultValue() != null && param.getDefaultValue().length > 0) + if (param.getDefaultValue() != null && param.getDefaultValue().length > 0) { arg += "=" + StringMan.join(param.getDefaultValue(), ","); + } } usage[i] = optional ? ("[" + arg + "]") : ("<" + arg + ">"); } @@ -104,7 +106,9 @@ public class UsageMessage extends Message { String argStr = usage[i]; text(separateArg(argStr.replaceAll("[\\[|\\]|<|>]", "&0$0&7"))); - if (params.isEmpty()) continue; + if (params.isEmpty()) { + continue; + } Parameter param = params.get(i); StringBuilder tooltip = new StringBuilder(); @@ -141,7 +145,9 @@ public class UsageMessage extends Message { tooltip.append("\nClick for more info"); } tooltip(tooltip.toString()); - if (command != null) command(command); + if (command != null) { + command(command); + } } newline(); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageUtil.java b/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageUtil.java index 7ba9553c3..1a9594283 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageUtil.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageUtil.java @@ -7,9 +7,7 @@ import com.boydti.fawe.util.MathMan; import com.sk89q.worldedit.util.command.parametric.ParameterException; import javax.annotation.Nullable; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.Transparency; +import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.io.File; @@ -25,54 +23,56 @@ public class ImageUtil { int targetWidth, int targetHeight, Object hint, - boolean higherQuality) - { + boolean higherQuality) { if (img.getHeight() == targetHeight && img.getWidth() == targetWidth) { return img; } - int type = (img.getTransparency() == Transparency.OPAQUE) ? - BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; + int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; BufferedImage ret = img; - int w, h; + int width, height; if (higherQuality) { // Use multi-step technique: start with original size, then // scale down in multiple passes with drawImage() // until the target size is reached - w = ret.getWidth(); - h = ret.getHeight(); + width = ret.getWidth(); + height = ret.getHeight(); } else { // Use one-step technique: scale directly from original // size to target size with a single drawImage() call - w = targetWidth; - h = targetHeight; + width = targetWidth; + height = targetHeight; } do { - if (higherQuality && w > targetWidth) { - w /= 2; - if (w < targetWidth) { - w = targetWidth; + if (higherQuality && width > targetWidth) { + width /= 2; + if (width < targetWidth) { + width = targetWidth; } - } else if (w < targetWidth) w = targetWidth; + } else if (width < targetWidth) { + width = targetWidth; + } - if (higherQuality && h > targetHeight) { - h /= 2; - if (h < targetHeight) { - h = targetHeight; + if (higherQuality && height > targetHeight) { + height /= 2; + if (height < targetHeight) { + height = targetHeight; } - } else if (h < targetHeight) h = targetHeight; + } else if (height < targetHeight) { + height = targetHeight; + } - BufferedImage tmp = new BufferedImage(w, h, type); + BufferedImage tmp = new BufferedImage(width, height, type); Graphics2D g2 = tmp.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint); g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); g2.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED); - g2.drawImage(ret, 0, 0, w, h, null); + g2.drawImage(ret, 0, 0, width, height, null); g2.dispose(); ret = tmp; - } while (w != targetWidth || h != targetHeight); + } while (width != targetWidth || height != targetHeight); return ret; } @@ -107,8 +107,9 @@ public class ImageUtil { if (alpha != 0) { float dx2 = sqrX[x]; float distSqr = dz2 + dx2; - if (distSqr > 1) raw[index] = 0; - else { + if (distSqr > 1) { + raw[index] = 0; + } else { alpha = (int) (alpha * (1 - distSqr)); raw[index] = (color & 0x00FFFFFF) + (alpha << 24); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageViewer.java b/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageViewer.java index ba3771651..76af804db 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageViewer.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageViewer.java @@ -2,6 +2,6 @@ package com.boydti.fawe.util.image; import java.io.Closeable; -public interface ImageViewer extends Closeable{ +public interface ImageViewer extends Closeable { public void view(Drawable drawable); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/task/TaskBuilder.java b/worldedit-core/src/main/java/com/boydti/fawe/util/task/TaskBuilder.java index 74b7959cf..c94f09396 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/task/TaskBuilder.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/task/TaskBuilder.java @@ -6,6 +6,7 @@ import com.boydti.fawe.object.Metadatable; import com.boydti.fawe.object.RunnableVal; import com.boydti.fawe.util.SetQueue; import com.boydti.fawe.util.TaskManager; + import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Objects; @@ -18,6 +19,12 @@ public class TaskBuilder extends Metadatable { private final ArrayDeque tasks; private Object result = null; private Thread.UncaughtExceptionHandler handler; + private FaweQueue queue; + private long last; + private long start; + private Object asyncWaitLock = new Object(); + private Object syncWaitLock = new Object(); + private boolean finished; public TaskBuilder() { this(null); @@ -168,7 +175,9 @@ public class TaskBuilder extends Metadatable { public TaskBuilder abortIfTrue(final Runnable run) { tasks.add(RunnableTask.adapt((Task) previous -> { - if (previous == Boolean.TRUE) run.run(); + if (previous == Boolean.TRUE) { + run.run(); + } return previous == Boolean.TRUE; }, TaskType.ABORT)); return this; @@ -176,7 +185,9 @@ public class TaskBuilder extends Metadatable { public TaskBuilder abortIfNull(final Runnable run) { tasks.add(RunnableTask.adapt((Task) previous -> { - if (previous == null) run.run(); + if (previous == null) { + run.run(); + } return previous == null; }, TaskType.ABORT)); return this; @@ -184,7 +195,9 @@ public class TaskBuilder extends Metadatable { public TaskBuilder abortIfEqual(final Runnable run, final Object other) { tasks.add(RunnableTask.adapt((Task) previous -> { - if (Objects.equals(previous, other)) run.run(); + if (Objects.equals(previous, other)) { + run.run(); + } return Objects.equals(previous, other); }, TaskType.ABORT)); return this; @@ -192,7 +205,9 @@ public class TaskBuilder extends Metadatable { public TaskBuilder abortIfNotEqual(final Runnable run, final Object other) { tasks.add(RunnableTask.adapt((Task) previous -> { - if (!Objects.equals(previous, other)) run.run(); + if (!Objects.equals(previous, other)) { + run.run(); + } return !Objects.equals(previous, other); }, TaskType.ABORT)); return this; @@ -314,6 +329,15 @@ public class TaskBuilder extends Metadatable { } } } + private enum TaskType { + SYNC, + ASYNC, + SYNC_PARALLEL, + ASYNC_PARALLEL, + SYNC_WHEN_FREE, + DELAY, + ABORT + } public static final class TaskAbortException extends RuntimeException { @Override @@ -322,13 +346,6 @@ public class TaskBuilder extends Metadatable { } } - private FaweQueue queue; - private long last; - private long start; - private Object asyncWaitLock = new Object(); - private Object syncWaitLock = new Object(); - private boolean finished; - private static abstract class RunnableTask extends RunnableVal { public final TaskType type; private boolean aborted; @@ -337,14 +354,6 @@ public class TaskBuilder extends Metadatable { this.type = type; } - public void abortNextTasks() { - this.aborted = true; - } - - public boolean isAborted() { - return aborted; - } - public static RunnableTask adapt(final Task task, TaskType type) { return new RunnableTask(type) { @Override @@ -387,6 +396,14 @@ public class TaskBuilder extends Metadatable { }; } + public void abortNextTasks() { + this.aborted = true; + } + + public boolean isAborted() { + return aborted; + } + public abstract T exec(Object previous); @Override @@ -401,13 +418,6 @@ public class TaskBuilder extends Metadatable { super(type); } - @Override - public Object exec(Object previous) { - return previous; - } - - public abstract int delay(Object previous); - public static RunnableDelayedTask adapt(final DelayedTask task) { return new RunnableDelayedTask(TaskType.DELAY) { @Override @@ -425,6 +435,13 @@ public class TaskBuilder extends Metadatable { } }; } + + @Override + public Object exec(Object previous) { + return previous; + } + + public abstract int delay(Object previous); } public static abstract class SplitTask extends RunnableTask { @@ -486,7 +503,9 @@ public class TaskBuilder extends Metadatable { try { if (!finished) { synchronized (asyncWaitLock) { - while (!waitingAsync) asyncWaitLock.wait(1); + while (!waitingAsync) { + asyncWaitLock.wait(1); + } asyncWaitLock.notifyAll(); } waitingSync = true; @@ -511,7 +530,9 @@ public class TaskBuilder extends Metadatable { if (now - start > allocation) { try { synchronized (syncWaitLock) { - while (!waitingSync) syncWaitLock.wait(1); + while (!waitingSync) { + syncWaitLock.wait(1); + } syncWaitLock.notifyAll(); } waitingAsync = true; @@ -526,14 +547,4 @@ public class TaskBuilder extends Metadatable { } } } - - private enum TaskType { - SYNC, - ASYNC, - SYNC_PARALLEL, - ASYNC_PARALLEL, - SYNC_WHEN_FREE, - DELAY, - ABORT - } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/terrain/Erosion.java b/worldedit-core/src/main/java/com/boydti/fawe/util/terrain/Erosion.java index 698cb3dfd..76a8b56c6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/terrain/Erosion.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/terrain/Erosion.java @@ -2,7 +2,6 @@ package com.boydti.fawe.util.terrain; import java.util.Arrays; - import static com.boydti.fawe.util.MathMan.pairInt; public final class Erosion { @@ -31,5 +30,4 @@ public final class Erosion { } - } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java index 03c708844..28e4acb67 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java @@ -20,16 +20,12 @@ package com.sk89q.jnbt; import com.boydti.fawe.jnbt.NBTStreamer; -import com.boydti.fawe.object.RunnableVal2; -import com.boydti.fawe.util.StringMan; import java.io.Closeable; -import java.io.DataInput; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -40,7 +36,7 @@ import java.util.function.Function; * 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 * http://www.minecraft.net/docs/NBT.txt.

@@ -52,7 +48,7 @@ public final class NBTInputStream implements Closeable { /** * 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 */ @@ -70,7 +66,7 @@ public final class NBTInputStream implements Closeable { /** * Reads an NBT tag from the stream. - * + * * @return The tag that was read. * @throws IOException if an I/O error occurs. */ @@ -84,13 +80,13 @@ public final class NBTInputStream implements Closeable { * @return The map that was read. * @throws IOException if an I/O error occurs. */ - public NamedData readNamedData() throws IOException { + public NamedData readNamedData() throws IOException { return readNamedData(0); } /** * 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. @@ -102,7 +98,7 @@ public final class NBTInputStream implements Closeable { private NamedData readNamedData(int depth) throws IOException { int type = is.readByte(); - return new NamedData(readNamedTagName(type), readDataPayload(type, depth)); + return new NamedData<>(readNamedTagName(type), readDataPayload(type, depth)); } public Tag readTag() throws IOException { @@ -522,7 +518,7 @@ public final class NBTInputStream implements Closeable { /** * Reads the payload of a tag given the type. - * + * * @param type the type * @param depth the depth * @return the tag @@ -611,7 +607,7 @@ public final class NBTInputStream implements Closeable { @Override public void close() throws IOException { - if (is instanceof AutoCloseable) { + if (is != null) { try { ((AutoCloseable) is).close(); } catch (Exception e) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/CuboidClipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/CuboidClipboard.java deleted file mode 100644 index af1392e4a..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/CuboidClipboard.java +++ /dev/null @@ -1,482 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit; - -import com.boydti.fawe.object.schematic.Schematic; -import com.boydti.fawe.util.MainUtil; - -import com.sk89q.worldedit.command.ClipboardCommands; -import com.sk89q.worldedit.command.FlattenedClipboardTransform; -import com.sk89q.worldedit.command.SchematicCommands; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; -import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; -import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; -import com.sk89q.worldedit.function.operation.ForwardExtentCopy; -import com.sk89q.worldedit.function.operation.Operations; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.transform.AffineTransform; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.util.Countable; -import com.sk89q.worldedit.util.Direction; -import com.sk89q.worldedit.world.DataException; -import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.world.block.BlockTypes; -import com.sk89q.worldedit.world.registry.LegacyMapper; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * The clipboard remembers the state of a cuboid region. - * - * @deprecated This is slowly being replaced with {@link Clipboard}, which is - * far more versatile. Transforms are supported using affine - * transformations and full entity support is provided because - * the clipboard properly implements {@link Extent}. However, - * the new clipboard class is only available in WorldEdit 6.x and - * beyond. We intend on keeping this deprecated class in WorldEdit - * for an extended amount of time so there is no rush to - * switch (but new features will not be supported). To copy between - * a clipboard and a world (or between any two {@code Extent}s), - * one can use {@link ForwardExtentCopy}. See - * {@link ClipboardCommands} and {@link SchematicCommands} for - * more information. - */ -@Deprecated -public class CuboidClipboard { - - /** - * An enum of possible flip directions. - */ - public enum FlipDirection { - NORTH_SOUTH(Direction.NORTH), - WEST_EAST(Direction.WEST), - UP_DOWN(Direction.UP), - ; - private final Direction direction; - FlipDirection(Direction direction) { - this.direction = direction; - } - } - - private BlockArrayClipboard clipboard; - private AffineTransform transform; - public BlockVector3 size; - - /** - * Constructs the clipboard. - * - * @param size the dimensions of the clipboard (should be at least 1 on every dimension) - */ - public CuboidClipboard(BlockVector3 size) { - checkNotNull(size); - MainUtil.warnDeprecated(BlockArrayClipboard.class, ClipboardFormat.class); - this.size = size; - this.clipboard = this.init(BlockVector3.ZERO, BlockVector3.ZERO); - } - - public CuboidClipboard(BlockArrayClipboard clipboard) { - this.clipboard = clipboard; - this.size = clipboard.getDimensions(); - } - - /** - * Constructs the clipboard. - * - * @param size the dimensions of the clipboard (should be at least 1 on every dimension) - * @param origin the origin point where the copy was made, which must be the - * {@link CuboidRegion#getMinimumPoint()} relative to the copy - */ - public CuboidClipboard(BlockVector3 size, BlockVector3 origin) { - checkNotNull(size); - checkNotNull(origin); - MainUtil.warnDeprecated(BlockArrayClipboard.class, ClipboardFormat.class); - this.size = size; - this.clipboard = init(BlockVector3.ZERO, origin); - } - - /** - * Constructs the clipboard. - * - * @param size the dimensions of the clipboard (should be at least 1 on every dimension) - * @param origin the origin point where the copy was made, which must be the - * {@link CuboidRegion#getMinimumPoint()} relative to the copy - * @param offset the offset from the minimum point of the copy where the user was - */ - public CuboidClipboard(BlockVector3 size, BlockVector3 origin, BlockVector3 offset) { - checkNotNull(size); - checkNotNull(origin); - checkNotNull(offset); - MainUtil.warnDeprecated(BlockArrayClipboard.class, ClipboardFormat.class); - this.size = size; - this.clipboard = this.init(offset, origin); - } - - /* ------------------------------------------------------------------------------------------------------------- */ - - private BlockArrayClipboard init(BlockVector3 offset, BlockVector3 min) { - BlockVector3 origin = min.subtract(offset); - CuboidRegion region = new CuboidRegion(min, min.add(size).subtract(BlockVector3.ONE)); - BlockArrayClipboard clipboard = new BlockArrayClipboard(region); - clipboard.setOrigin(origin); - return clipboard; - } - - /* ------------------------------------------------------------------------------------------------------------- */ - - public BaseBlock getBlock(BlockVector3 position) { - return getBlock(position.getBlockX(), position.getBlockY(), position.getBlockZ()); - } - - - public BaseBlock getBlock(int x, int y, int z) { -// return adapt(clipboard.IMP.getBlock(x, y, z)); - return clipboard.IMP.getBlock(x, y, z); - } - - public BaseBlock getLazyBlock(BlockVector3 position) { - return getBlock(position); - } - - public void setBlock(BlockVector3 location, BaseBlock block) { - setBlock(location.getBlockX(), location.getBlockY(), location.getBlockZ(), block); - } - - public boolean setBlock(int x, int y, int z, BaseBlock block) { - return setBlock(x, y, z, block); - } - - public boolean setBlock(int x, int y, int z, BlockState block) { - return clipboard.IMP.setBlock(x, y, z, block); - } - - /** - * Get the width (X-direction) of the clipboard. - * - * @return width - */ - public int getWidth() { - return size.getBlockX(); - } - - /** - * Get the length (Z-direction) of the clipboard. - * - * @return length - */ - public int getLength() { - return size.getBlockZ(); - } - - /** - * Get the height (Y-direction) of the clipboard. - * - * @return height - */ - public int getHeight() { - return size.getBlockY(); - } - - /** - * Rotate the clipboard in 2D. It can only rotate by angles divisible by 90. - * - * @param angle in degrees - */ - @SuppressWarnings("deprecation") - public void rotate2D(int angle) { - AffineTransform newTransform = new AffineTransform().rotateY(-angle); - this.transform = transform == null ? newTransform : newTransform.combine(transform); - } - - /** - * Flip the clipboard. - * - * @param dir direction to flip - */ - public void flip(FlipDirection dir) { - flip(dir, false); - } - - /** - * Flip the clipboard. - * - * @param dir direction to flip - * @param aroundPlayer flip the offset around the player - */ - @SuppressWarnings("deprecation") - public void flip(FlipDirection dir, boolean aroundPlayer) { - checkNotNull(dir); - Direction direction = dir.direction; - AffineTransform newTransform = new AffineTransform().scale(direction.toVector().abs().multiply(-2).add(1, 1, 1)); - this.transform = transform == null ? newTransform : newTransform.combine(transform); - } - - /** - * Copies blocks to the clipboard. - * - * @param editSession the EditSession from which to take the blocks - */ - public void copy(EditSession editSession) { - for (int x = 0; x < size.getBlockX(); ++x) { - for (int y = 0; y < size.getBlockY(); ++y) { - for (int z = 0; z < size.getBlockZ(); ++z) { - setBlock(x, y, z, editSession.getBlock(BlockVector3.at(x, y, z).add(getOrigin()))); - } - } - } - } - - /** - * Copies blocks to the clipboard. - * - * @param editSession The EditSession from which to take the blocks - * @param region A region that further constrains which blocks to take. - */ - public void copy(EditSession editSession, Region region) { - for (int x = 0; x < size.getBlockX(); ++x) { - for (int y = 0; y < size.getBlockY(); ++y) { - for (int z = 0; z < size.getBlockZ(); ++z) { - final BlockVector3 pt = BlockVector3.at(x, y, z).add(getOrigin()); - if (region.contains(pt)) { - setBlock(x, y, z, editSession.getBlock(pt)); - } else { - setBlock(x, y, z, (BlockState)null); - } - } - } - } - } - - /** - * Paste the clipboard at the given location using the given {@code EditSession}. - *

- *

This method blocks the server/game until the entire clipboard is - * pasted. In the future, {@link ForwardExtentCopy} will be recommended, - * which, if combined with the proposed operation scheduler framework, - * will not freeze the game/server.

- * - * @param editSession the EditSession to which blocks are to be copied to - * @param newOrigin the new origin point (must correspond to the minimum point of the cuboid) - * @param noAir true to not copy air blocks in the source - * @throws MaxChangedBlocksException thrown if too many blocks were changed - */ - public void paste(EditSession editSession, BlockVector3 newOrigin, boolean noAir) throws MaxChangedBlocksException { - paste(editSession, newOrigin, noAir, false); - } - - /** - * Paste the clipboard at the given location using the given {@code EditSession}. - *

- *

This method blocks the server/game until the entire clipboard is - * pasted. In the future, {@link ForwardExtentCopy} will be recommended, - * which, if combined with the proposed operation scheduler framework, - * will not freeze the game/server.

- * - * @param editSession the EditSession to which blocks are to be copied to - * @param newOrigin the new origin point (must correspond to the minimum point of the cuboid) - * @param noAir true to not copy air blocks in the source - * @param entities true to copy entities - * @throws MaxChangedBlocksException thrown if too many blocks were changed - */ - public void paste(EditSession editSession, BlockVector3 newOrigin, boolean noAir, boolean entities) throws MaxChangedBlocksException { - new Schematic(clipboard).paste(editSession, newOrigin, false, !noAir, entities, transform); - editSession.flushQueue(); - } - - /** - * Paste the clipboard at the given location using the given {@code EditSession}. - *

- *

This method blocks the server/game until the entire clipboard is - * pasted. In the future, {@link ForwardExtentCopy} will be recommended, - * which, if combined with the proposed operation scheduler framework, - * will not freeze the game/server.

- * - * @param editSession the EditSession to which blocks are to be copied to - * @param newOrigin the new origin point (must correspond to the minimum point of the cuboid) - * @param noAir true to not copy air blocks in the source - * @throws MaxChangedBlocksException thrown if too many blocks were changed - */ - public void place(EditSession editSession, BlockVector3 newOrigin, boolean noAir) throws MaxChangedBlocksException { - paste(editSession, newOrigin, noAir, false); - } - - /** - * Get the block at the given position. - *

- *

If the position is out of bounds, air will be returned.

- * - * @param position the point, relative to the origin of the copy (0, 0, 0) and not to the actual copy origin - * @return air, if this block was outside the (non-cuboid) selection while copying - * @throws ArrayIndexOutOfBoundsException if the position is outside the bounds of the CuboidClipboard - * @deprecated use {@link #getBlock(Vector)} instead - */ - @Deprecated - public BaseBlock getPoint(BlockVector3 position) throws ArrayIndexOutOfBoundsException { - final BaseBlock block = getBlock(position); - if (block == null) { - return BlockTypes.AIR.getDefaultState().toBaseBlock(); - } - - return block; - } - - /** - * Get the origin point, which corresponds to where the copy was - * originally copied from. The origin is the lowest possible X, Y, and - * Z components of the cuboid region that was copied. - * - * @return the origin - */ - public BlockVector3 getOrigin() { - return clipboard.getMinimumPoint(); - } - - /** - * Set the origin point, which corresponds to where the copy was - * originally copied from. The origin is the lowest possible X, Y, and - * Z components of the cuboid region that was copied. - * - * @param origin the origin to set - */ - public void setOrigin(BlockVector3 origin) { - checkNotNull(origin); - setOriginAndOffset(getOffset(), origin); - } - - public void setOriginAndOffset(BlockVector3 offset, BlockVector3 min) { - BlockVector3 origin = min.subtract(offset); - CuboidRegion region = new CuboidRegion(min, min.add(size).subtract(BlockVector3.ONE)); - clipboard.setRegion(region); - clipboard.setOrigin(origin); - } - - /** - * Get the offset of the player to the clipboard's minimum point - * (minimum X, Y, Z coordinates). - *

- *

The offset is inverse (multiplied by -1).

- * - * @return the offset the offset - */ - public BlockVector3 getOffset() { - BlockVector3 min = clipboard.getMinimumPoint(); - BlockVector3 origin = clipboard.getOrigin(); - BlockVector3 offset = min.subtract(origin); - return offset; - } - - /** - * Set the offset of the player to the clipboard's minimum point - * (minimum X, Y, Z coordinates). - *

- *

The offset is inverse (multiplied by -1).

- * - * @param offset the new offset - */ - public void setOffset(BlockVector3 offset) { - checkNotNull(offset); - setOriginAndOffset(offset, getOrigin()); - } - - /** - * Get the dimensions of the clipboard. - * - * @return the dimensions, where (1, 1, 1) is 1 wide, 1 across, 1 deep - */ - public BlockVector3 getSize() { - return size; - } - - /** - * Saves the clipboard data to a .schematic-format file. - * - * @param path the path to the file to save - * @throws IOException thrown on I/O error - * @throws DataException thrown on error writing the data for other reasons - * @deprecated use {@link ClipboardFormat#SCHEMATIC} - */ - @Deprecated - public void saveSchematic(File path) throws IOException, DataException { - checkNotNull(path); - if (transform != null && !transform.isIdentity()) { - final FlattenedClipboardTransform result = FlattenedClipboardTransform.transform(clipboard, transform); - BlockArrayClipboard target = new BlockArrayClipboard(result.getTransformedRegion(), UUID.randomUUID()); - target.setOrigin(clipboard.getOrigin()); - Operations.completeLegacy(result.copyTo(target)); - this.clipboard = target; - } - new Schematic(clipboard).save(path, BuiltInClipboardFormat.SPONGE_SCHEMATIC); - } - - /** - * Load a .schematic file into a clipboard. - * - * @param path the path to the file to load - * @return a clipboard - * @throws IOException thrown on I/O error - * @throws DataException thrown on error writing the data for other reasons - * @deprecated use {@link ClipboardFormat#SCHEMATIC} - */ - @Deprecated - public static CuboidClipboard loadSchematic(File path) throws DataException, IOException { - checkNotNull(path); - return new CuboidClipboard((BlockVector3) BuiltInClipboardFormat.MCEDIT_SCHEMATIC.load(path).getClipboard()); - } - - /** - * Get the block distribution inside a clipboard. - * - * @return a block distribution - */ - public List> getBlockDistribution() { - List> distribution = new ArrayList<>(); - List> distr = clipboard.getBlockDistributionWithData(clipboard.getRegion()); - for (Countable item : distr) { - BlockStateHolder state = item.getID(); - int[] legacyId = LegacyMapper.getInstance().getLegacyFromBlock(state.toImmutableState()); - if (legacyId[0] != 0) distribution.add(new Countable<>(legacyId[0], item.getAmount())); - } - return distribution; - } - - /** - * Get the block distribution inside a clipboard with data values. - * - * @return a block distribution - */ - public List> getBlockDistributionWithData() { - List> distribution = new ArrayList<>(); - List> distr = clipboard.getBlockDistributionWithData(clipboard.getRegion()); - for (Countable item : distr) { - distribution.add(new Countable<>(item.getID().toBaseBlock(), item.getAmount())); - } - return distribution; - } -} \ No newline at end of file diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index 8968ab652..a4088e5a3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -151,6 +151,7 @@ import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.*; import com.sk89q.worldedit.world.weather.WeatherType; +import net.royawesome.jlibnoise.module.modifier.Abs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -423,7 +424,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, public void resetLimit() { this.limit.set(this.originalLimit); - ExtentTraverser find = new ExtentTraverser(extent).find(ProcessedWEExtent.class); + ExtentTraverser find = new ExtentTraverser<>(extent).find(ProcessedWEExtent.class); if (find != null && find.get() != null) { find.get().setLimit(this.limit); } @@ -462,7 +463,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, * @return FaweRegionExtent (may be null) */ public FaweRegionExtent getRegionExtent() { - ExtentTraverser traverser = new ExtentTraverser(this.extent).find(FaweRegionExtent.class); + ExtentTraverser traverser = new ExtentTraverser<>(this.extent).find(FaweRegionExtent.class); return traverser == null ? null : traverser.get(); } @@ -494,12 +495,12 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, } public boolean cancel() { - ExtentTraverser traverser = new ExtentTraverser(this.extent); + ExtentTraverser traverser = new ExtentTraverser<>(this.extent); NullExtent nullExtent = new NullExtent(world, BBC.WORLDEDIT_CANCEL_REASON_MANUAL); while (traverser != null) { - ExtentTraverser next = traverser.next(); + ExtentTraverser next = traverser.next(); Extent get = traverser.get(); - if (get instanceof AbstractDelegateExtent && !(get instanceof NullExtent)) { + if (get != null && !(get instanceof NullExtent)) { traverser.setNext(nullExtent); } traverser = next; @@ -738,7 +739,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, * @return mask, may be null */ public Mask getMask() { - ExtentTraverser maskingExtent = new ExtentTraverser(this.extent).find(MaskingExtent.class); + ExtentTraverser maskingExtent = new ExtentTraverser<>(this.extent).find(MaskingExtent.class); return maskingExtent != null ? maskingExtent.get().getMask() : null; } @@ -748,16 +749,16 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, * @return mask, may be null */ public Mask getSourceMask() { - ExtentTraverser maskingExtent = new ExtentTraverser(this.extent).find(SourceMaskExtent.class); + ExtentTraverser maskingExtent = new ExtentTraverser<>(this.extent).find(SourceMaskExtent.class); return maskingExtent != null ? maskingExtent.get().getMask() : null; } public void addTransform(ResettableExtent transform) { wrapped = true; if (transform == null) { - ExtentTraverser traverser = new ExtentTraverser(this.extent).find(ResettableExtent.class); + ExtentTraverser traverser = new ExtentTraverser<>(this.extent).find(ResettableExtent.class); AbstractDelegateExtent next = extent; - while (traverser != null && traverser.get() instanceof ResettableExtent) { + while (traverser != null && traverser.get() != null) { traverser = traverser.next(); next = traverser.get(); } @@ -769,9 +770,9 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, } public @Nullable ResettableExtent getTransform() { - ExtentTraverser traverser = new ExtentTraverser(this.extent).find(ResettableExtent.class); + ExtentTraverser traverser = new ExtentTraverser<>(this.extent).find(ResettableExtent.class); if (traverser != null) { - return (ResettableExtent) traverser.get(); + return traverser.get(); } return null; } @@ -787,7 +788,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, } else { new MaskTraverser(mask).reset(this); } - ExtentTraverser maskingExtent = new ExtentTraverser(this.extent).find(SourceMaskExtent.class); + ExtentTraverser maskingExtent = new ExtentTraverser<>(this.extent).find(SourceMaskExtent.class); if (maskingExtent != null && maskingExtent.get() != null) { Mask oldMask = maskingExtent.get().getMask(); if (oldMask instanceof ResettableMask) { @@ -826,7 +827,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, } else { new MaskTraverser(mask).reset(this); } - ExtentTraverser maskingExtent = new ExtentTraverser(this.extent).find(MaskingExtent.class); + ExtentTraverser maskingExtent = new ExtentTraverser<>(this.extent).find(MaskingExtent.class); if (maskingExtent != null && maskingExtent.get() != null) { Mask oldMask = maskingExtent.get().getMask(); if (oldMask instanceof ResettableMask) { @@ -844,13 +845,13 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, * @return the survival simulation extent */ public SurvivalModeExtent getSurvivalExtent() { - ExtentTraverser survivalExtent = new ExtentTraverser(this.extent).find(SurvivalModeExtent.class); + ExtentTraverser survivalExtent = new ExtentTraverser<>(this.extent).find(SurvivalModeExtent.class); if (survivalExtent != null) { return survivalExtent.get(); } else { AbstractDelegateExtent extent = this.extent; SurvivalModeExtent survival = new SurvivalModeExtent(extent.getExtent(), getWorld()); - new ExtentTraverser(extent).setNext(survival); + new ExtentTraverser<>(extent).setNext(survival); return survival; } } @@ -877,21 +878,21 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, if (history == null) { return; } - ExtentTraverser traverseHistory = new ExtentTraverser(this.extent).find(HistoryExtent.class); + ExtentTraverser traverseHistory = new ExtentTraverser<>(this.extent).find(HistoryExtent.class); if (disableHistory) { if (traverseHistory != null && traverseHistory.exists()) { - ExtentTraverser beforeHistory = traverseHistory.previous(); - ExtentTraverser afterHistory = traverseHistory.next(); + ExtentTraverser beforeHistory = traverseHistory.previous(); + ExtentTraverser afterHistory = traverseHistory.next(); if (beforeHistory != null && beforeHistory.exists()) { beforeHistory.setNext(afterHistory.get()); } else { - extent = (AbstractDelegateExtent) afterHistory.get(); + extent = afterHistory.get(); } } } else if (traverseHistory == null || !traverseHistory.exists()) { - ExtentTraverser traverseBypass = new ExtentTraverser(this.extent).find(bypassHistory); + ExtentTraverser traverseBypass = new ExtentTraverser<>(this.extent).find(bypassHistory); if (traverseBypass != null) { - ExtentTraverser beforeHistory = traverseBypass.previous(); + ExtentTraverser beforeHistory = traverseBypass.previous(); beforeHistory.setNext(history); } } @@ -950,7 +951,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, if (changeSet instanceof BlockBagChangeSet) { missingBlocks = ((BlockBagChangeSet) changeSet).popMissing(); } else { - ExtentTraverser find = new ExtentTraverser(extent).find(BlockBagExtent.class); + ExtentTraverser find = new ExtentTraverser<>(extent).find(BlockBagExtent.class); if (find != null && find.get() != null) { missingBlocks = find.get().popMissing(); } else { @@ -1410,7 +1411,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, if (used.MAX_FAILS > 0) { if (used.MAX_CHANGES > 0 || used.MAX_ENTITIES > 0) { BBC.WORLDEDIT_SOME_FAILS.send(player, used.MAX_FAILS); - } else if (new ExtentTraverser(this).findAndGet(FaweRegionExtent.class) != null){ + } else if (new ExtentTraverser<>(this).findAndGet(FaweRegionExtent.class) != null){ BBC.WORLDEDIT_CANCEL_REASON_OUTSIDE_REGION.send(player); } else { BBC.WORLDEDIT_CANCEL_REASON_OUTSIDE_LEVEL.send(player); @@ -3358,7 +3359,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, } public Set getHollowed(final Set vset) { - final Set returnset = new LocalBlockVectorSet(); + final Set returnset = new LocalBlockVectorSet(); final LocalBlockVectorSet newset = new LocalBlockVectorSet(); newset.addAll(vset); for (final BlockVector3 v : newset) { @@ -3384,19 +3385,19 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue, if (block.getBlockType().getMaterial().isMovementBlocker()) { continue; } - + if (!outside.add(current)) { continue; } - + if (!region.contains(current)) { continue; } - + for (BlockVector3 recurseDirection : recurseDirections) { queue.add(current.add(recurseDirection)); } - } + } } public int makeBiomeShape(final Region region, final Vector3 zero, final Vector3 unit, final BiomeType biomeType, diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/FlattenedClipboardTransform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/FlattenedClipboardTransform.java index 5e2bdd9b8..6b80d6658 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/FlattenedClipboardTransform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/FlattenedClipboardTransform.java @@ -33,12 +33,9 @@ import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; - -import static com.google.common.base.Preconditions.checkNotNull; - /** * Helper class to 'bake' a transform into a clipboard. - *

+ * *

This class needs a better name and may need to be made more generic.

* * @see Clipboard @@ -52,7 +49,7 @@ public class FlattenedClipboardTransform { /** * Create a new instance. * - * @param original the original clipboard + * @param original the original clipboard * @param transform the transform */ private FlattenedClipboardTransform(Clipboard original, Transform transform) { @@ -94,10 +91,10 @@ public class FlattenedClipboardTransform { Vector3 newMinimum = corners[0]; Vector3 newMaximum = corners[0]; + for (int i = 1; i < corners.length; i++) { - Vector3 cbv = corners[i]; - newMinimum = newMinimum.getMinimum(cbv); - newMaximum = newMaximum.getMaximum(cbv); + newMinimum = newMinimum.getMinimum(corners[i]); + newMaximum = newMaximum.getMaximum(corners[i]); } // After transformation, the points may not really sit on a block, @@ -125,7 +122,7 @@ public class FlattenedClipboardTransform { /** * Create a new instance to bake the transform with. * - * @param original the original clipboard + * @param original the original clipboard * @param transform the transform * @return a builder */ @@ -133,5 +130,4 @@ public class FlattenedClipboardTransform { return new FlattenedClipboardTransform(original, transform); } - } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java index 9edebfa3d..93b6b7b6a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java @@ -31,7 +31,6 @@ import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandPermissions; import com.sk89q.minecraft.util.commands.Logging; - import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; @@ -44,17 +43,16 @@ import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.visitor.RegionVisitor; import com.sk89q.worldedit.internal.annotation.Selection; import com.sk89q.worldedit.internal.expression.ExpressionException; -import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.TreeGenerator.TreeType; import com.sk89q.worldedit.util.command.binding.Range; import com.sk89q.worldedit.util.command.binding.Switch; import com.sk89q.worldedit.util.command.binding.Text; import com.sk89q.worldedit.util.command.parametric.Optional; -import com.sk89q.worldedit.util.command.parametric.ParameterException; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockType; @@ -63,7 +61,9 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; -import static com.sk89q.minecraft.util.commands.Logging.LogMode.*; +import static com.sk89q.minecraft.util.commands.Logging.LogMode.ALL; +import static com.sk89q.minecraft.util.commands.Logging.LogMode.PLACEMENT; +import static com.sk89q.minecraft.util.commands.Logging.LogMode.POSITION; /** @@ -82,14 +82,14 @@ public class GenerationCommands extends MethodCommands { } @Command( - aliases = {"/caves"}, + aliases = { "/caves" }, usage = "[size=8] [freq=40] [rarity=7] [minY=8] [maxY=127] [sysFreq=1] [sysRarity=25] [pocketRarity=0] [pocketMin=0] [pocketMax=3]", desc = "Generates caves", help = "Generates a cave network" ) @CommandPermissions("worldedit.generation.caves") @Logging(PLACEMENT) - public void caves(FawePlayer fp, LocalSession session, EditSession editSession, @Selection Region region, @Optional("8") int size, @Optional("40") int frequency, @Optional("7") int rarity, @Optional("8") int minY, @Optional("127") int maxY, @Optional("1") int systemFrequency, @Optional("25") int individualRarity, @Optional("0") int pocketChance, @Optional("0") int pocketMin, @Optional("3") int pocketMax, CommandContext context) throws WorldEditException, ParameterException { + public void caves(FawePlayer fp, LocalSession session, EditSession editSession, @Selection Region region, @Optional("8") int size, @Optional("40") int frequency, @Optional("7") int rarity, @Optional("8") int minY, @Optional("127") int maxY, @Optional("1") int systemFrequency, @Optional("25") int individualRarity, @Optional("0") int pocketChance, @Optional("0") int pocketMin, @Optional("3") int pocketMax, CommandContext context) throws WorldEditException { fp.checkConfirmationRegion(() -> { CavesGen gen = new CavesGen(size, frequency, rarity, minY, maxY, systemFrequency, individualRarity, pocketChance, pocketMin, pocketMax); editSession.generate(region, gen); @@ -100,7 +100,7 @@ public class GenerationCommands extends MethodCommands { // public void addOre(Mask mask, Pattern material, int size, int frequency, int rarity, int minY, int maxY) throws WorldEditException { @Command( - aliases = {"/ores"}, + aliases = { "/ores" }, desc = "Generates ores", help = "Generates ores", min = 1, @@ -108,7 +108,7 @@ public class GenerationCommands extends MethodCommands { ) @CommandPermissions("worldedit.generation.ore") @Logging(PLACEMENT) - public void ores(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, CommandContext context) throws WorldEditException, ParameterException { + public void ores(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, CommandContext context) throws WorldEditException { player.checkConfirmationRegion(() -> { editSession.addOres(region, mask); BBC.VISITOR_BLOCK.send(player, editSession.getBlockChangeCount()); @@ -116,7 +116,7 @@ public class GenerationCommands extends MethodCommands { } @Command( - aliases = {"/image", "/img"}, + aliases = { "/image", "/img" }, desc = "Generate an image", usage = " [randomize=true] [complexity=100] [dimensions=100,100]", min = 1, @@ -124,7 +124,7 @@ public class GenerationCommands extends MethodCommands { ) @CommandPermissions("worldedit.generation.image") @Logging(PLACEMENT) - public void image(Player player, LocalSession session, EditSession editSession, String arg, @Optional("true") boolean randomize, @Optional("100") int threshold, @Optional BlockVector2 dimensions) throws WorldEditException, ParameterException, IOException { + public void image(Player player, LocalSession session, EditSession editSession, String arg, @Optional("true") boolean randomize, @Optional("100") int threshold, @Optional BlockVector2 dimensions) throws WorldEditException, IOException { TextureUtil tu = Fawe.get().getCachedTextureUtil(randomize, 0, threshold); URL url = new URL(arg); if (!url.getHost().equalsIgnoreCase("i.imgur.com") && !url.getHost().equalsIgnoreCase("empcraft.com")) { @@ -174,7 +174,7 @@ public class GenerationCommands extends MethodCommands { ) @CommandPermissions("worldedit.generation.ore") @Logging(PLACEMENT) - public void ore(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, Pattern material, @Range(min = 0) int size, int freq, @Range(min = 0, max = 100) int rarity, @Range(min = 0, max = 255) int minY, @Range(min = 0, max = 255) int maxY, CommandContext context) throws WorldEditException, ParameterException { + public void ore(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, Pattern material, @Range(min = 0) int size, int freq, @Range(min = 0, max = 100) int rarity, @Range(min = 0, max = 255) int minY, @Range(min = 0, max = 255) int maxY, CommandContext context) throws WorldEditException { player.checkConfirmationRegion(() -> { editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY); BBC.VISITOR_BLOCK.send(player, editSession.getBlockChangeCount()); @@ -182,7 +182,7 @@ public class GenerationCommands extends MethodCommands { } @Command( - aliases = {"/hcyl"}, + aliases = { "/hcyl" }, usage = " [,] [height]", desc = "Generates a hollow cylinder.", help = @@ -195,18 +195,18 @@ public class GenerationCommands extends MethodCommands { ) @CommandPermissions("worldedit.generation.cylinder") @Logging(PLACEMENT) - public void hcyl(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector2 radius, @Optional("1") int height, @Range(min = 1) @Optional("1") double thickness, CommandContext context) throws WorldEditException, ParameterException { - double max = MathMan.max(radius.getBlockX(), radius.getBlockZ()); + public void hcyl(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector2 radius, @Optional("1") int height, @Range(min = 1) @Optional("1") double thickness, CommandContext context) throws WorldEditException { + int max = Math.max(radius.getBlockX(), radius.getBlockZ()); worldEdit.checkMaxRadius(max); BlockVector3 pos = session.getPlacementPosition(player); fp.checkConfirmationRadius(() -> { int affected = editSession.makeHollowCylinder(pos, pattern, radius.getX(), radius.getZ(), Math.min(256, height), thickness - 1); BBC.VISITOR_BLOCK.send(fp, affected); - }, getArguments(context), (int) max, context); + }, getArguments(context), max, context); } @Command( - aliases = {"/cyl"}, + aliases = { "/cyl" }, usage = " [,] [height]", flags = "h", desc = "Generates a cylinder.", @@ -220,18 +220,18 @@ public class GenerationCommands extends MethodCommands { ) @CommandPermissions("worldedit.generation.cylinder") @Logging(PLACEMENT) - public void cyl(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector2 radius, @Optional("1") int height, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException, ParameterException { - double max = MathMan.max(radius.getBlockX(), radius.getBlockZ()); + public void cyl(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector2 radius, @Optional("1") int height, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException { + int max = Math.max(radius.getBlockX(), radius.getBlockZ()); worldEdit.checkMaxRadius(max); BlockVector3 pos = session.getPlacementPosition(player); fp.checkConfirmationRadius(() -> { int affected = editSession.makeCylinder(pos, pattern, radius.getX(), radius.getZ(), Math.min(256, height), !hollow); BBC.VISITOR_BLOCK.send(fp, affected); - }, getArguments(context), (int) max, context); + }, getArguments(context), max, context); } @Command( - aliases = {"/hsphere"}, + aliases = { "/hsphere" }, usage = " [,,] [raised?]", desc = "Generates a hollow sphere.", help = @@ -244,12 +244,12 @@ public class GenerationCommands extends MethodCommands { ) @CommandPermissions("worldedit.generation.sphere") @Logging(PLACEMENT) - public void hsphere(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector3 radius, @Optional("false") boolean raised, CommandContext context) throws WorldEditException, ParameterException { + public void hsphere(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector3 radius, @Optional("false") boolean raised, CommandContext context) throws WorldEditException { sphere(fp, player, session, editSession, pattern, radius, raised, true, context); } @Command( - aliases = {"/sphere"}, + aliases = { "/sphere" }, usage = " [,,] [raised?]", flags = "h", desc = "Generates a filled sphere.", @@ -263,7 +263,7 @@ public class GenerationCommands extends MethodCommands { ) @CommandPermissions("worldedit.generation.sphere") @Logging(PLACEMENT) - public void sphere(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector3 radius, @Optional("false") boolean raised, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException, ParameterException { + public void sphere(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector3 radius, @Optional("false") boolean raised, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException { double max = MathMan.max(radius.getBlockX(), radius.getBlockY(), radius.getBlockZ()); worldEdit.checkMaxRadius(max); BlockVector3 pos = session.getPlacementPosition(player); @@ -276,36 +276,37 @@ public class GenerationCommands extends MethodCommands { } @Command( - aliases = {"forestgen"}, - usage = "[size] [tree-type] [density]", - desc = "Generate a forest", - min = 0, - max = 3 + aliases = { "forestgen" }, + usage = "[size] [type] [density]", + desc = "Generate a forest", + min = 0, + max = 3 ) @CommandPermissions("worldedit.generation.forest") @Logging(POSITION) - @SuppressWarnings("deprecation") - public void forestGen(Player player, LocalSession session, EditSession editSession, @Optional("10") int size, @Optional("tree") TreeType type, @Optional("5") @Range(min = 0, max = 100) double density) throws WorldEditException, ParameterException { + public void forestGen(Player player, LocalSession session, EditSession editSession, @Optional("10") int size, + @Optional("tree") TreeType type, @Optional("5") @Range(min = 0, max = 100) double density) throws WorldEditException { density = density / 100; int affected = editSession.makeForest(session.getPlacementPosition(player), size, density, type); - player.print(BBC.getPrefix() + affected + " trees created."); + player.print(affected + " trees created."); } @Command( - aliases = {"pumpkins"}, - usage = "[size=10]", - desc = "Generate pumpkin patches", - max = 2 + aliases = { "pumpkins" }, + usage = "[size]", + desc = "Generate pumpkin patches", + min = 0, + max = 1 ) @CommandPermissions("worldedit.generation.pumpkins") @Logging(POSITION) - public void pumpkins(Player player, LocalSession session, EditSession editSession, @Optional("10") int apothem) throws WorldEditException, ParameterException { + public void pumpkins(Player player, LocalSession session, EditSession editSession, @Optional("10") int apothem) throws WorldEditException { int affected = editSession.makePumpkinPatches(session.getPlacementPosition(player), apothem); BBC.COMMAND_PUMPKIN.send(player, affected); } @Command( - aliases = {"/hpyramid"}, + aliases = { "/hpyramid" }, usage = " ", desc = "Generate a hollow pyramid", min = 2, @@ -313,21 +314,21 @@ public class GenerationCommands extends MethodCommands { ) @CommandPermissions("worldedit.generation.pyramid") @Logging(PLACEMENT) - public void hollowPyramid(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, @Range(min = 1) int size, CommandContext context) throws WorldEditException, ParameterException { + public void hollowPyramid(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, @Range(min = 1) int size, CommandContext context) throws WorldEditException { pyramid(fp, player, session, editSession, pattern, size, true, context); } @Command( - aliases = {"/pyramid"}, - usage = " ", - flags = "h", - desc = "Generate a filled pyramid", - min = 2, - max = 2 + aliases = { "/pyramid" }, + usage = " ", + flags = "h", + desc = "Generate a filled pyramid", + min = 2, + max = 2 ) @CommandPermissions("worldedit.generation.pyramid") @Logging(PLACEMENT) - public void pyramid(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, @Range(min = 1) int size, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException, ParameterException { + public void pyramid(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, @Range(min = 1) int size, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException { BlockVector3 pos = session.getPlacementPosition(player); worldEdit.checkMaxRadius(size); fp.checkConfirmationRadius(() -> { @@ -336,7 +337,7 @@ public class GenerationCommands extends MethodCommands { BBC.VISITOR_BLOCK.send(fp, affected); }, getArguments(context), size, context); } - + @Command( aliases = {"/generate", "/gen", "/g"}, @@ -394,7 +395,7 @@ public class GenerationCommands extends MethodCommands { if (unit.getY() == 0) unit = unit.withY(1.0); if (unit.getZ() == 0) unit = unit.withZ(1.0); } - + final Vector3 unit1 = unit; fp.checkConfirmationRegion(() -> { @@ -464,9 +465,9 @@ public class GenerationCommands extends MethodCommands { if (unit.getY() == 0) unit = unit.withY(1.0); if (unit.getZ() == 0) unit = unit.withZ(1.0); } - + final Vector3 unit1 = unit; - + fp.checkConfirmationRegion(() -> { try { final int affected = editSession.makeBiomeShape(region, zero, unit1, target, expression, hollow); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java index 072a957c4..28bebed85 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java @@ -50,6 +50,8 @@ import java.io.File; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; +import static com.google.common.base.Preconditions.checkNotNull; + /** * Commands to undo, redo, and clear history. */ @@ -63,10 +65,11 @@ public class HistoryCommands extends MethodCommands { */ public HistoryCommands(WorldEdit worldEdit) { super(worldEdit); + checkNotNull(worldEdit); } @Command( - aliases = {"/frb", "frb", "fawerollback", "/fawerollback", "/rollback"}, + aliases = { "/frb", "frb", "fawerollback", "/fawerollback", "/rollback" }, usage = " ", desc = "Undo a specific edit. " + " - The time uses s, m, h, d, y.\n" + @@ -80,74 +83,72 @@ public class HistoryCommands extends MethodCommands { BBC.SETTING_DISABLE.send(player, "history.use-database (Import with /frb #import )"); return; } - switch (user.charAt(0)) { - case '#': { - if (user.equals("#import")) { - if (!player.hasPermission("fawe.rollback.import")) { - BBC.NO_PERM.send(player, "fawe.rollback.import"); - return; + if (user.charAt(0) == '#') { + if (user.equals("#import")) { + if (!player.hasPermission("fawe.rollback.import")) { + BBC.NO_PERM.send(player, "fawe.rollback.import"); + return; + } + File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY); + if (!folder.exists()) { + return; + } + for (File worldFolder : folder.listFiles()) { + if (!worldFolder.isDirectory()) { + continue; } - File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY); - if (!folder.exists()) { - return; - } - for (File worldFolder : folder.listFiles()) { - if (!worldFolder.isDirectory()) { - continue; - } - String worldName = worldFolder.getName(); - World world = FaweAPI.getWorld(worldName); - if (world != null) { - for (File userFolder : worldFolder.listFiles()) { - if (!userFolder.isDirectory()) { - continue; - } - String userUUID = userFolder.getName(); - try { - UUID uuid = UUID.fromString(userUUID); - for (File historyFile : userFolder.listFiles()) { - String name = historyFile.getName(); - if (!name.endsWith(".bd")) { - continue; - } - RollbackOptimizedHistory rollback = new RollbackOptimizedHistory(world, uuid, Integer.parseInt(name.substring(0, name.length() - 3))); - DiskStorageHistory.DiskStorageSummary summary = rollback.summarize(RegionWrapper.GLOBAL(), false); - if (summary != null) { - rollback.setDimensions(BlockVector3.at(summary.minX, 0, summary.minZ), BlockVector3.at(summary.maxX, 255, summary.maxZ)); - rollback.setTime(historyFile.lastModified()); - RollbackDatabase db = DBHandler.IMP.getDatabase(world); - db.logEdit(rollback); - player.print(BBC.getPrefix() + "Logging: " + historyFile); - } + String worldName = worldFolder.getName(); + World world = FaweAPI.getWorld(worldName); + if (world != null) { + for (File userFolder : worldFolder.listFiles()) { + if (!userFolder.isDirectory()) { + continue; + } + String userUUID = userFolder.getName(); + try { + UUID uuid = UUID.fromString(userUUID); + for (File historyFile : userFolder.listFiles()) { + String name = historyFile.getName(); + if (!name.endsWith(".bd")) { + continue; + } + RollbackOptimizedHistory rollback = new RollbackOptimizedHistory(world, uuid, Integer.parseInt(name.substring(0, name.length() - 3))); + DiskStorageHistory.DiskStorageSummary summary = rollback.summarize(RegionWrapper.GLOBAL(), false); + if (summary != null) { + rollback.setDimensions(BlockVector3.at(summary.minX, 0, summary.minZ), BlockVector3.at(summary.maxX, 255, summary.maxZ)); + rollback.setTime(historyFile.lastModified()); + RollbackDatabase db = DBHandler.IMP.getDatabase(world); + db.logEdit(rollback); + player.print(BBC.getPrefix() + "Logging: " + historyFile); } - } catch (IllegalArgumentException e) { - e.printStackTrace(); - continue; } + } catch (IllegalArgumentException e) { + e.printStackTrace(); + continue; } } } - player.print(BBC.getPrefix() + "Done import!"); - return; - } - String toParse = user.substring(1); - if (!MathMan.isInteger(toParse)) { - BBC.COMMAND_SYNTAX.send(player, "/frb #"); - return; - } - int index = Integer.parseInt(toParse); - final World world = player.getWorld(); - UUID uuid = player.getUniqueId(); - DiskStorageHistory file = new DiskStorageHistory(world, uuid, index); - if (file.getBDFile().exists()) { - if (restore) file.redo(FawePlayer.wrap(player)); - else file.undo(FawePlayer.wrap(player)); - BBC.ROLLBACK_ELEMENT.send(player, Fawe.imp().getWorldName(world) + "/" + user + "-" + index); - } else { - BBC.TOOL_INSPECT_INFO_FOOTER.send(player, 0); } + player.print(BBC.getPrefix() + "Done import!"); return; } + String toParse = user.substring(1); + if (!MathMan.isInteger(toParse)) { + BBC.COMMAND_SYNTAX.send(player, "/frb #"); + return; + } + int index = Integer.parseInt(toParse); + final World world = player.getWorld(); + UUID uuid = player.getUniqueId(); + DiskStorageHistory file = new DiskStorageHistory(world, uuid, index); + if (file.getBDFile().exists()) { + if (restore) file.redo(FawePlayer.wrap(player)); + else file.undo(FawePlayer.wrap(player), null); + BBC.ROLLBACK_ELEMENT.send(player, Fawe.imp().getWorldName(world) + "/" + user + "-" + index); + } else { + BBC.TOOL_INSPECT_INFO_FOOTER.send(player, 0); + } + return; } UUID other = Fawe.imp().getUUID(user); if (other == null) { @@ -196,16 +197,11 @@ public class HistoryCommands extends MethodCommands { BBC.ROLLBACK_ELEMENT.send(player, Fawe.imp().getWorldName(edit.getWorld()) + "/" + user + "-" + edit.getIndex()); count.incrementAndGet(); } - }, new Runnable() { - @Override - public void run() { - BBC.TOOL_INSPECT_INFO_FOOTER.send(player, count); - } - }, true, restore); + }, () -> BBC.TOOL_INSPECT_INFO_FOOTER.send(player, count), true, restore); } @Command( - aliases = {"/fawerestore", "/frestore"}, + aliases = { "/fawerestore", "/frestore" }, usage = " ", desc = "Redo a specific edit. " + " - The time uses s, m, h, d, y.\n" + @@ -219,30 +215,30 @@ public class HistoryCommands extends MethodCommands { } @Command( - aliases = {"/undo", "undo"}, - usage = "[times] [player]", - desc = "Undoes the last action", - min = 0, - max = 2 + aliases = { "/undo", "undo" }, + usage = "[times] [player]", + desc = "Undoes the last action", + min = 0, + max = 2 ) @CommandPermissions("worldedit.history.undo") - public void undo(Player player, LocalSession session, CommandContext context) throws WorldEditException { + public void undo(Player player, LocalSession session, CommandContext args) throws WorldEditException { if (session.hasFastMode()) { BBC.COMMAND_UNDO_DISABLED.send(player); return; } - int times = Math.max(1, context.getInteger(0, 1)); + int times = Math.max(1, args.getInteger(0, 1)); FawePlayer.wrap(player).checkConfirmation(() -> { EditSession undone = null; int i = 0; for (; i < times; ++i) { - if (context.argsLength() < 2) { + if (args.argsLength() < 2) { undone = session.undo(session.getBlockBag(player), player); } else { player.checkPermission("worldedit.history.undo.other"); - LocalSession sess = worldEdit.getSessionManager().findByName(context.getString(1)); + LocalSession sess = worldEdit.getSessionManager().findByName(args.getString(1)); if (sess == null) { - BBC.COMMAND_HISTORY_OTHER_ERROR.send(player, context.getString(1)); + BBC.COMMAND_HISTORY_OTHER_ERROR.send(player, args.getString(1)); break; } undone = sess.undo(session.getBlockBag(player), player); @@ -257,18 +253,19 @@ public class HistoryCommands extends MethodCommands { if (undone == null) { BBC.COMMAND_UNDO_ERROR.send(player); } - }, getArguments(context), times, 50, context); + }, getArguments(args), times, 50, args); } @Command( - aliases = {"/redo", "redo"}, - usage = "[times] [player]", - desc = "Redoes the last action (from history)", - min = 0, - max = 2 + aliases = { "/redo", "redo" }, + usage = "[times] [player]", + desc = "Redoes the last action (from history)", + min = 0, + max = 2 ) @CommandPermissions("worldedit.history.redo") public void redo(Player player, LocalSession session, CommandContext args) throws WorldEditException { + int times = Math.max(1, args.getInteger(0, 1)); EditSession redone = null; @@ -298,11 +295,11 @@ public class HistoryCommands extends MethodCommands { } @Command( - aliases = {"/clearhistory", "clearhistory"}, - usage = "", - desc = "Clear your history", - min = 0, - max = 0 + aliases = { "/clearhistory", "clearhistory" }, + usage = "", + desc = "Clear your history", + min = 0, + max = 0 ) @CommandPermissions("worldedit.history.clear") public void clearHistory(Player player, LocalSession session) throws WorldEditException { @@ -311,4 +308,4 @@ public class HistoryCommands extends MethodCommands { } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java index c00cd587b..a4c964a7b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java @@ -65,16 +65,16 @@ public class NavigationCommands { ) @CommandPermissions("worldedit.navigation.unstuck") public void unstuck(Player player) throws WorldEditException { - player.findFreePosition(); BBC.UNSTUCK.send(player); + player.findFreePosition(); } @Command( - aliases = {"ascend", "asc"}, - usage = "[# of levels]", - desc = "Go up a floor", - min = 0, - max = 1 + aliases = { "ascend", "asc" }, + usage = "[# of levels]", + desc = "Go up a floor", + min = 0, + max = 1 ) @CommandPermissions("worldedit.navigation.ascend") public void ascend(Player player, @Optional("1") int levelsToAscend) throws WorldEditException { @@ -97,11 +97,11 @@ public class NavigationCommands { } @Command( - aliases = {"descend", "desc"}, - usage = "[# of floors]", - desc = "Go down a floor", - min = 0, - max = 1 + aliases = { "descend", "desc" }, + usage = "[# of floors]", + desc = "Go down a floor", + min = 0, + max = 1 ) @CommandPermissions("worldedit.navigation.descend") public void descend(Player player, @Optional("1") int levelsToDescend) throws WorldEditException { @@ -124,19 +124,19 @@ public class NavigationCommands { } @Command( - aliases = {"ceil"}, - usage = "[clearance]", - desc = "Go to the celing", - flags = "fg", - min = 0, - max = 1 + aliases = { "ceil" }, + usage = "[clearance]", + desc = "Go to the celing", + flags = "fg", + min = 0, + max = 1 ) @CommandPermissions("worldedit.navigation.ceiling") @Logging(POSITION) public void ceiling(Player player, CommandContext args) throws WorldEditException { final int clearance = args.argsLength() > 0 ? - Math.max(0, args.getInteger(0)) : 0; + Math.max(0, args.getInteger(0)) : 0; final boolean alwaysGlass = getAlwaysGlass(args); if (player.ascendToCeiling(clearance, alwaysGlass)) { @@ -147,11 +147,11 @@ public class NavigationCommands { } @Command( - aliases = {"thru"}, - usage = "", - desc = "Passthrough walls", - min = 0, - max = 0 + aliases = { "thru" }, + usage = "", + desc = "Passthrough walls", + min = 0, + max = 0 ) @CommandPermissions("worldedit.navigation.thru.command") public void thru(Player player) throws WorldEditException { @@ -163,7 +163,7 @@ public class NavigationCommands { } @Command( - aliases = {"jumpto", "j"}, + aliases = { "jumpto", "j" }, usage = "[world,x,y,z]", desc = "Teleport to a location\n" + "Flags:" + @@ -197,12 +197,12 @@ public class NavigationCommands { } @Command( - aliases = {"up"}, - usage = "", - desc = "Go upwards some distance", - flags = "fg", - min = 1, - max = 1 + aliases = { "up" }, + usage = "", + desc = "Go upwards some distance", + flags = "fg", + min = 1, + max = 1 ) @CommandPermissions("worldedit.navigation.up") @Logging(POSITION) @@ -231,6 +231,4 @@ public class NavigationCommands { return forceGlass || (config.navigationUseGlass && !forceFlight); } - - } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java index a538527ee..48e028ddc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java @@ -220,14 +220,14 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/line"}, + aliases = { "/line" }, usage = " [thickness]", desc = "Draws a line segment between cuboid selection corners", help = - "Draws a line segment between cuboid selection corners.\n" + - "Can only be used with cuboid selections.\n" + - "Flags:\n" + - " -h generates only a shell", + "Draws a line segment between cuboid selection corners.\n" + + "Can only be used with cuboid selections.\n" + + "Flags:\n" + + " -h generates only a shell", flags = "h", min = 1, max = 2 @@ -241,7 +241,7 @@ public class RegionCommands extends MethodCommands { @Switch('h') boolean shell) throws WorldEditException { if (!(region instanceof CuboidRegion)) { - player.printError(BBC.getPrefix() + "//line only works with cuboid selections"); + player.printError("//line only works with cuboid selections"); return; } @@ -254,14 +254,14 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/curve", "/spline"}, + aliases = { "/curve", "/spline" }, usage = " [thickness]", desc = "Draws a spline through selected points", help = - "Draws a spline through selected points.\n" + - "Can only be used with convex polyhedral selections.\n" + - "Flags:\n" + - " -h generates only a shell", + "Draws a spline through selected points.\n" + + "Can only be used with convex polyhedral selections.\n" + + "Flags:\n" + + " -h generates only a shell", flags = "h", min = 1, max = 2 @@ -275,7 +275,7 @@ public class RegionCommands extends MethodCommands { @Switch('h') boolean shell, CommandContext context) throws WorldEditException { if (!(region instanceof ConvexPolyhedralRegion)) { - player.sendMessage(BBC.getPrefix() + "//curve only works with convex polyhedral selections"); + player.toWorldEditPlayer().printError("//curve only works with convex polyhedral selections"); return; } worldEdit.checkMaxRadius(thickness); @@ -293,10 +293,10 @@ public class RegionCommands extends MethodCommands { @Command( aliases = { "/replace", "/re", "/rep" }, usage = "[from-mask] ", - desc = "Replace all blocks in the selection with another", - flags = "f", - min = 1, - max = 2 + desc = "Replace all blocks in the selection with another", + flags = "f", + min = 1, + max = 2 ) @CommandPermissions("worldedit.region.replace") @Logging(REGION) @@ -336,11 +336,11 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/overlay"}, - usage = "", - desc = "Set a block on top of blocks in the region", - min = 1, - max = 1 + aliases = { "/overlay" }, + usage = "", + desc = "Set a block on top of blocks in the region", + min = 1, + max = 1 ) @CommandPermissions("worldedit.region.overlay") @Logging(REGION) @@ -386,11 +386,11 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/center", "/middle"}, - usage = "", - desc = "Set the center block(s)", - min = 1, - max = 1 + aliases = { "/center", "/middle" }, + usage = "", + desc = "Set the center block(s)", + min = 1, + max = 1 ) @Logging(REGION) @CommandPermissions("worldedit.region.center") @@ -400,11 +400,11 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/naturalize"}, - usage = "", - desc = "3 layers of dirt on top then rock below", - min = 0, - max = 0 + aliases = { "/naturalize" }, + usage = "", + desc = "3 layers of dirt on top then rock below", + min = 0, + max = 0 ) @CommandPermissions("worldedit.region.naturalize") @Logging(REGION) @@ -416,11 +416,11 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/walls"}, - usage = "", - desc = "Build the four sides of the selection", - min = 1, - max = 1 + aliases = { "/walls" }, + usage = "", + desc = "Build the four sides of the selection", + min = 1, + max = 1 ) @CommandPermissions("worldedit.region.walls") @Logging(REGION) @@ -432,11 +432,11 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/faces", "/outline"}, - usage = "", - desc = "Build the walls, ceiling, and floor of a selection", - min = 1, - max = 1 + aliases = { "/faces", "/outline" }, + usage = "", + desc = "Build the walls, ceiling, and floor of a selection", + min = 1, + max = 1 ) @CommandPermissions("worldedit.region.faces") @Logging(REGION) @@ -458,7 +458,7 @@ public class RegionCommands extends MethodCommands { min = 0, max = 2 ) - @CommandPermissions("worldedit.region.smoothsnow") + @CommandPermissions("worldedit.region.smooth") @Logging(REGION) public void smooth(FawePlayer player, EditSession editSession, @Selection Region region, @Optional("1") int iterations, @Optional Mask mask, @Switch('s') boolean snow, CommandContext context) throws WorldEditException { BlockVector3 min = region.getMinimumPoint(); @@ -514,23 +514,23 @@ public class RegionCommands extends MethodCommands { @Command( - aliases = {"/move"}, - usage = "[count] [direction] [leave-id]", - flags = "sbea", - desc = "Move the contents of the selection", - help = - "Moves the contents of the selection.\n" + - "The -s flag shifts the selection to the target location.\n" + - " -b also copies biomes\n" + - " -e ignores entities\n" + - " -a ignores air\n" + - "Optionally fills the old location with .", - min = 0, - max = 3 + aliases = { "/move" }, + usage = "[count] [direction] [leave-id]", + flags = "sabe", + desc = "Move the contents of the selection", + help = + "Moves the contents of the selection.\n" + + "The -s flag shifts the selection to the target location.\n" + + " -b also copies biomes\n" + + " -e ignores entities\n" + + "The -a flag skips air blocks.\n" + + "Optionally fills the old location with .", + min = 0, + max = 3 ) @CommandPermissions("worldedit.region.move") @Logging(ORIENTATION_REGION) - public void move(FawePlayer player, LocalSession session, EditSession editSession, + public void move(FawePlayer player, EditSession editSession, LocalSession session, @Selection Region region, @Optional("1") @Range(min = 1) int count, @Optional(Direction.AIM) @Direction(includeDiagonals = true) BlockVector3 direction, @@ -550,7 +550,7 @@ public class RegionCommands extends MethodCommands { session.getRegionSelector(player.getWorld()).learnChanges(); session.getRegionSelector(player.getWorld()).explainRegionAdjust(player.getPlayer(), session); } catch (RegionOperationException e) { - player.sendMessage(BBC.getPrefix() + e.getMessage()); + player.toWorldEditPlayer().printError(e.getMessage()); } } @@ -583,21 +583,21 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/stack"}, - usage = "[count] [direction]", - flags = "sam", - desc = "Repeat the contents of the selection", - help = - "Repeats the contents of the selection.\n" + - "Flags:\n" + - " -s shifts the selection to the last stacked copy\n" + - " -a skips air blocks", - min = 0, - max = 2 + aliases = { "/stack" }, + usage = "[count] [direction]", + flags = "sam", + desc = "Repeat the contents of the selection", + help = + "Repeats the contents of the selection.\n" + + "Flags:\n" + + " -s shifts the selection to the last stacked copy\n" + + " -a skips air blocks", + min = 0, + max = 2 ) @CommandPermissions("worldedit.region.stack") @Logging(ORIENTATION_REGION) - public void stack(FawePlayer player, LocalSession session, EditSession editSession, + public void stack(FawePlayer player, EditSession editSession, LocalSession session, @Selection Region region, @Optional("1") @Range(min = 1) int count, @Optional(Direction.AIM) @Direction(includeDiagonals = true) BlockVector3 direction, @@ -620,7 +620,7 @@ public class RegionCommands extends MethodCommands { session.getRegionSelector(player.getWorld()).learnChanges(); session.getRegionSelector(player.getWorld()).explainRegionAdjust(player.getPlayer(), session); } catch (RegionOperationException e) { - player.sendMessage(BBC.getPrefix() + e.getMessage()); + player.sendMessage(e.getMessage()); } } @@ -629,14 +629,14 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/deform"}, + aliases = { "/deform" }, usage = "", desc = "Deforms a selected region with an expression", help = - "Deforms a selected region with an expression\n" + - "The expression is executed for each block and is expected\n" + - "to modify the variables x, y and z to point to a new block\n" + - "to fetch. See also tinyurl.com/wesyntax.", + "Deforms a selected region with an expression\n" + + "The expression is executed for each block and is expected\n" + + "to modify the variables x, y and z to point to a new block\n" + + "to fetch. See also tinyurl.com/wesyntax.", flags = "ro", min = 1, max = -1 @@ -647,10 +647,10 @@ public class RegionCommands extends MethodCommands { @Selection Region region, @Text String expression, @Switch('r') boolean useRawCoords, - @Switch('o') boolean offset, - CommandContext context) throws WorldEditException { + @Switch('o') boolean offset, CommandContext context) throws WorldEditException { final Vector3 zero; Vector3 unit; + if (useRawCoords) { zero = Vector3.ZERO; unit = Vector3.ONE; @@ -676,7 +676,7 @@ public class RegionCommands extends MethodCommands { player.findFreePosition(); BBC.VISITOR_BLOCK.send(fp, affected); } catch (ExpressionException e) { - fp.sendMessage(BBC.getPrefix() + e.getMessage()); + fp.sendMessage(e.getMessage()); } }, getArguments(context), region, context); } @@ -727,15 +727,15 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/hollow"}, - usage = "[[ ]]", - desc = "Hollows out the object contained in this selection", - help = - "Hollows out the object contained in this selection.\n" + - "Optionally fills the hollowed out part with the given block.\n" + - "Thickness is measured in manhattan distance.", - min = 0, - max = 2 + aliases = { "/hollow" }, + usage = "[[ ]]", + desc = "Hollows out the object contained in this selection", + help = + "Hollows out the object contained in this selection.\n" + + "Optionally fills the hollowed out part with the given block.\n" + + "Thickness is measured in manhattan distance.", + min = 0, + max = 2 ) @CommandPermissions("worldedit.region.hollow") @Logging(REGION) @@ -751,7 +751,7 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/forest"}, + aliases = { "/forest" }, usage = "[type] [density]", desc = "Make a forest within the region", min = 0, @@ -766,7 +766,7 @@ public class RegionCommands extends MethodCommands { } @Command( - aliases = {"/flora"}, + aliases = { "/flora" }, usage = "[density]", desc = "Make flora within the region", min = 0, @@ -776,15 +776,14 @@ public class RegionCommands extends MethodCommands { @Logging(REGION) public void flora(FawePlayer player, EditSession editSession, @Selection Region region, @Optional("10") @Range(min = 0, max = 100) double density, CommandContext context) throws WorldEditException { player.checkConfirmationRegion(() -> { - FloraGenerator generator = new FloraGenerator(editSession); - GroundFunction ground = new GroundFunction(new ExistingBlockMask(editSession), generator); - LayerVisitor visitor = new LayerVisitor(asFlatRegion(region), minimumBlockY(region), maximumBlockY(region), ground); - visitor.setMask(new NoiseFilter2D(new RandomNoise(), density / 100)); - Operations.completeLegacy(visitor); + FloraGenerator generator = new FloraGenerator(editSession); + GroundFunction ground = new GroundFunction(new ExistingBlockMask(editSession), generator); + LayerVisitor visitor = new LayerVisitor(asFlatRegion(region), minimumBlockY(region), maximumBlockY(region), ground); + visitor.setMask(new NoiseFilter2D(new RandomNoise(), density / 100)); + Operations.completeLegacy(visitor); BBC.COMMAND_FLORA.send(player, ground.getAffected()); }, getArguments(context), region, context); } - } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ScriptingCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ScriptingCommands.java index dd26d49f8..8a6f8cf7f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ScriptingCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ScriptingCommands.java @@ -29,21 +29,22 @@ import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.Player; -import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.CommandManager; import com.sk89q.worldedit.scripting.CraftScriptContext; import com.sk89q.worldedit.scripting.CraftScriptEngine; import com.sk89q.worldedit.scripting.RhinoCraftScriptEngine; -import com.sk89q.worldedit.session.request.Request; import org.mozilla.javascript.NativeJavaObject; -import javax.annotation.Nullable; import javax.script.ScriptException; -import java.io.*; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; -import java.util.function.Function; import static com.google.common.base.Preconditions.checkNotNull; import static com.sk89q.minecraft.util.commands.Logging.LogMode.ALL; @@ -61,7 +62,7 @@ public class ScriptingCommands { * * @param worldEdit reference to WorldEdit */ - public ScriptingCommands(final WorldEdit worldEdit) { + public ScriptingCommands(WorldEdit worldEdit) { checkNotNull(worldEdit); this.worldEdit = worldEdit; } @@ -78,16 +79,12 @@ public class ScriptingCommands { } public static T runScript(Player player, File f, String[] args) throws WorldEditException { - return runScript(player, f, args, null); - } - - public static T runScript(Actor actor, File f, String[] args, @Nullable Function processor) throws WorldEditException { String filename = f.getPath(); int index = filename.lastIndexOf("."); - String ext = filename.substring(index + 1, filename.length()); + String ext = filename.substring(index + 1); if (!ext.equalsIgnoreCase("js")) { - actor.printError(BBC.getPrefix() + "Only .js scripts are currently supported"); + player.printError("Only .js scripts are currently supported"); return null; } @@ -100,69 +97,63 @@ public class ScriptingCommands { file = WorldEdit.class.getResourceAsStream("craftscripts/" + filename); if (file == null) { - actor.printError(BBC.getPrefix() + "Script does not exist: " + filename); + player.printError("Script does not exist: " + filename); return null; } } else { file = new FileInputStream(f); } - DataInputStream in = new DataInputStream(file); - byte[] data = new byte[in.available()]; - in.readFully(data); - in.close(); - script = new String(data, 0, data.length, "utf-8"); + byte[] data; + try (DataInputStream in = new DataInputStream(file)) { + data = new byte[in.available()]; + in.readFully(data); + } + script = new String(data, 0, data.length, StandardCharsets.UTF_8); } catch (IOException e) { - actor.printError(BBC.getPrefix() + "Script read error: " + e.getMessage()); + player.printError("Script read error: " + e.getMessage()); return null; } - if (processor != null) { - script = processor.apply(script); - } + WorldEdit worldEdit1 = WorldEdit.getInstance(); + LocalSession session = worldEdit1.getSessionManager().get(player); - WorldEdit worldEdit = WorldEdit.getInstance(); - LocalSession session = worldEdit.getSessionManager().get(actor); - - CraftScriptEngine engine = null; + CraftScriptEngine engine; Object result = null; try { engine = new RhinoCraftScriptEngine(); } catch (NoClassDefFoundError e) { - actor.printError("Failed to find an installed script engine."); - actor.printError("Download: https://github.com/downloads/mozilla/rhino/rhino1_7R4.zip"); - actor.printError("Extract: `js.jar` to `plugins` or `mods` directory`"); - actor.printError("More info: https://github.com/boy0001/CraftScripts/"); + player.printError("Failed to find an installed script engine."); + player.printError("Download: https://github.com/downloads/mozilla/rhino/rhino1_7R4.zip"); + player.printError("Extract: `js.jar` to `plugins` or `mods` directory`"); + player.printError("More info: https://github.com/boy0001/CraftScripts/"); return null; } - engine.setTimeLimit(worldEdit.getConfiguration().scriptTimeout); + engine.setTimeLimit(worldEdit1.getConfiguration().scriptTimeout); - Player player = actor instanceof Player ? (Player) actor : null; - CraftScriptContext scriptContext = new CraftScriptContext(worldEdit, WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.USER_COMMANDS), - WorldEdit.getInstance().getConfiguration(), session, player, args); + CraftScriptContext scriptContext = new CraftScriptContext(worldEdit1, worldEdit1.getPlatformManager().queryCapability(Capability.USER_COMMANDS), + worldEdit1.getConfiguration(), session, player, args); Map vars = new HashMap<>(); vars.put("argv", args); vars.put("context", scriptContext); - vars.put("actor", actor); + vars.put("actor", player); vars.put("player", player); try { result = engine.evaluate(script, filename, vars); } catch (ScriptException e) { e.printStackTrace(); - actor.printError(BBC.getPrefix() + "Failed to execute:"); - actor.printRaw(e.getMessage()); - } catch (NumberFormatException e) { - throw e; - } catch (WorldEditException e) { + player.printError(BBC.getPrefix() + "Failed to execute:"); + player.printRaw(e.getMessage()); + } catch (NumberFormatException | WorldEditException e) { throw e; } catch (Throwable e) { - actor.printError(BBC.getPrefix() + "Failed to execute (see console):"); - actor.printRaw(e.getClass().getCanonicalName()); + player.printError("Failed to execute (see console):"); + player.printRaw(e.getClass().getCanonicalName()); e.printStackTrace(); } if (result instanceof NativeJavaObject) { @@ -171,12 +162,19 @@ public class ScriptingCommands { return (T) result; } - @Command(aliases = {"cs"}, usage = " [args...]", desc = "Execute a CraftScript", min = 1, max = -1) + @Command( + aliases = { "cs" }, + usage = " [args...]", + desc = "Execute a CraftScript", + min = 1, + max = -1 + ) @CommandPermissions("worldedit.scripting.execute") @Logging(ALL) - public void execute(final Player player, final LocalSession session, final CommandContext args) throws WorldEditException { - final String[] scriptArgs = args.getSlice(1); - final String name = args.getString(0); + public void execute(Player player, LocalSession session, CommandContext args) throws WorldEditException { + + String[] scriptArgs = args.getSlice(1); + String name = args.getString(0); if (!player.hasPermission("worldedit.scripting.execute." + name)) { BBC.SCRIPTING_NO_PERM.send(player); @@ -185,8 +183,8 @@ public class ScriptingCommands { session.setLastScript(name); - final File dir = this.worldEdit.getWorkingDirectoryFile(this.worldEdit.getConfiguration().scriptsDir); - final File f = this.worldEdit.getSafeOpenFile(player, dir, name, "js", "js"); + File dir = worldEdit.getWorkingDirectoryFile(worldEdit.getConfiguration().scriptsDir); + File f = worldEdit.getSafeOpenFile(player, dir, name, "js", "js"); try { new RhinoCraftScriptEngine(); } catch (NoClassDefFoundError e) { @@ -199,11 +197,17 @@ public class ScriptingCommands { runScript(LocationMaskedPlayerWrapper.unwrap(player), f, scriptArgs); } - @Command(aliases = {".s"}, usage = "[args...]", desc = "Execute last CraftScript", min = 0, max = -1) + @Command( + aliases = { ".s" }, + usage = "[args...]", + desc = "Execute last CraftScript", + min = 0, + max = -1 + ) @CommandPermissions("worldedit.scripting.execute") @Logging(ALL) public void executeLast(Player player, LocalSession session, CommandContext args) throws WorldEditException { - + String lastScript = session.getLastScript(); if (!player.hasPermission("worldedit.scripting.execute." + lastScript)) { @@ -216,17 +220,11 @@ public class ScriptingCommands { return; } - final String[] scriptArgs = args.getSlice(0); + String[] scriptArgs = args.getSlice(0); - final File dir = this.worldEdit.getWorkingDirectoryFile(this.worldEdit.getConfiguration().scriptsDir); - final File f = this.worldEdit.getSafeOpenFile(player, dir, lastScript, "js", "js"); + File dir = worldEdit.getWorkingDirectoryFile(worldEdit.getConfiguration().scriptsDir); + File f = worldEdit.getSafeOpenFile(player, dir, lastScript, "js", "js"); - try { - this.worldEdit.runScript(LocationMaskedPlayerWrapper.unwrap(player), f, scriptArgs); - } catch (final WorldEditException ex) { - BBC.SCRIPTING_ERROR.send(player); - } + worldEdit.runScript(player, f, scriptArgs); } - - } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java index 20f6fd0f0..deff381ae 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java @@ -94,11 +94,11 @@ public class SelectionCommands { } @Command( - aliases = {"/pos1", "posa", "/1"}, - usage = "[coordinates]", - desc = "Set position 1", - min = 0, - max = 1 + aliases = { "/pos1", "posa", "/1" }, + usage = "[coordinates]", + desc = "Set position 1", + min = 0, + max = 1 ) @Logging(POSITION) @CommandPermissions("worldedit.selection.pos") @@ -123,15 +123,16 @@ public class SelectionCommands { return; } - session.getRegionSelector(player.getWorld()).explainPrimarySelection(player, session, pos); + session.getRegionSelector(player.getWorld()) + .explainPrimarySelection(player, session, pos); } @Command( - aliases = {"/pos2", "posb", "/2"}, - usage = "[coordinates]", - desc = "Set position 2", - min = 0, - max = 1 + aliases = { "/pos2", "posb", "/2" }, + usage = "[coordinates]", + desc = "Set position 2", + min = 0, + max = 1 ) @Logging(POSITION) @CommandPermissions("worldedit.selection.pos") @@ -162,38 +163,40 @@ public class SelectionCommands { } @Command( - aliases = {"/hpos1"}, - usage = "", - desc = "Set position 1 to targeted block", - min = 0, - max = 0 + aliases = { "/hpos1" }, + usage = "", + desc = "Set position 1 to targeted block", + min = 0, + max = 0 ) @CommandPermissions("worldedit.selection.hpos") - public void hpos1(Player player, LocalSession session, CommandContext args) throws WorldEditException { - BlockVector3 pos = player.getBlockTrace(300).toBlockPoint(); + public void hpos1(Player player, LocalSession session) throws WorldEditException { + + Location pos = player.getBlockTrace(300); if (pos != null) { - if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos, ActorSelectorLimits.forActor(player))) { + if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos.toVector().toBlockPoint(), ActorSelectorLimits.forActor(player))) { BBC.SELECTOR_ALREADY_SET.send(player); return; } session.getRegionSelector(player.getWorld()) - .explainPrimarySelection(player, session, pos); + .explainPrimarySelection(player, session, pos.toVector().toBlockPoint()); } else { BBC.NO_BLOCK.send(player); } } @Command( - aliases = {"/hpos2"}, - usage = "", - desc = "Set position 2 to targeted block", - min = 0, - max = 0 + aliases = { "/hpos2" }, + usage = "", + desc = "Set position 2 to targeted block", + min = 0, + max = 0 ) @CommandPermissions("worldedit.selection.hpos") - public void hpos2(Player player, LocalSession session, CommandContext args) throws WorldEditException { + public void hpos2(Player player, LocalSession session) throws WorldEditException { + BlockVector3 pos = player.getBlockTrace(300).toBlockPoint(); if (pos != null) { @@ -210,20 +213,20 @@ public class SelectionCommands { } @Command( - aliases = {"/chunk"}, - usage = "[x,z coordinates]", - flags = "sc", - desc = "Set the selection to your current chunk.", - help = - "Set the selection to the chunk you are currently in.\n" + - "With the -s flag, your current selection is expanded\n" + - "to encompass all chunks that are part of it.\n\n" + - "Specifying coordinates will use those instead of your\n" + - "current position. Use -c to specify chunk coordinates,\n" + - "otherwise full coordinates will be implied.\n" + - "(for example, the coordinates 5,5 are the same as -c 0,0)", - min = 0, - max = 1 + aliases = { "/chunk" }, + usage = "[x,z coordinates]", + flags = "sc", + desc = "Set the selection to your current chunk.", + help = + "Set the selection to the chunk you are currently in.\n" + + "With the -s flag, your current selection is expanded\n" + + "to encompass all chunks that are part of it.\n\n" + + "Specifying coordinates will use those instead of your\n"+ + "current position. Use -c to specify chunk coordinates,\n" + + "otherwise full coordinates will be implied.\n" + + "(for example, the coordinates 5,5 are the same as -c 0,0)", + min = 0, + max = 1 ) @Logging(POSITION) @CommandPermissions("worldedit.selection.chunk") @@ -279,14 +282,15 @@ public class SelectionCommands { } @Command( - aliases = {"/wand", "/w"}, - usage = "", - desc = "Get the wand object", - min = 0, - max = 0 + aliases = { "/wand" }, + usage = "", + desc = "Get the wand object", + min = 0, + max = 0 ) @CommandPermissions("worldedit.wand") public void wand(Player player) throws WorldEditException { + player.giveItem(new BaseItemStack(ItemTypes.parse(we.getConfiguration().wandItem), 1)); BBC.SELECTION_WAND.send(player); if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) @@ -294,11 +298,11 @@ public class SelectionCommands { } @Command( - aliases = {"toggleeditwand"}, - usage = "", - desc = "Toggle functionality of the edit wand", - min = 0, - max = 0 + aliases = { "toggleeditwand" }, + usage = "", + desc = "Toggle functionality of the edit wand", + min = 0, + max = 0 ) @CommandPermissions("worldedit.wand.toggle") public void toggleWand(Player player, LocalSession session, CommandContext args) throws WorldEditException { @@ -313,11 +317,11 @@ public class SelectionCommands { } @Command( - aliases = {"/expand"}, - usage = " [reverse-amount] ", - desc = "Expand the selection area", - min = 1, - max = 3 + aliases = { "/expand" }, + usage = " [reverse-amount] ", + desc = "Expand the selection area", + min = 1, + max = 3 ) @Logging(REGION) @CommandPermissions("worldedit.selection.expand") @@ -325,7 +329,8 @@ public class SelectionCommands { // Special syntax (//expand vert) to expand the selection between // sky and bedrock. - if (args.getString(0).equalsIgnoreCase("vert") || args.getString(0).equalsIgnoreCase("vertical")) { + if (args.getString(0).equalsIgnoreCase("vert") + || args.getString(0).equalsIgnoreCase("vertical")) { Region region = session.getSelection(player.getWorld()); try { int oldSize = region.getArea(); @@ -342,6 +347,7 @@ public class SelectionCommands { return; } + List dirs = new ArrayList<>(); int change = args.getInteger(0); int reverseChange = 0; @@ -400,15 +406,16 @@ public class SelectionCommands { int newSize = region.getArea(); session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); + BBC.SELECTION_EXPAND.send(player, (newSize - oldSize)); } @Command( - aliases = {"/contract"}, - usage = " [reverse-amount] [direction]", - desc = "Contract the selection area", - min = 1, - max = 3 + aliases = { "/contract" }, + usage = " [reverse-amount] [direction]", + desc = "Contract the selection area", + min = 1, + max = 3 ) @Logging(REGION) @CommandPermissions("worldedit.selection.contract") @@ -478,11 +485,11 @@ public class SelectionCommands { } @Command( - aliases = {"/shift"}, - usage = " [direction]", - desc = "Shift the selection area", - min = 1, - max = 2 + aliases = { "/shift" }, + usage = " [direction]", + desc = "Shift the selection area", + min = 1, + max = 2 ) @Logging(REGION) @CommandPermissions("worldedit.selection.shift") @@ -512,6 +519,7 @@ public class SelectionCommands { session.getRegionSelector(player.getWorld()).learnChanges(); session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); + BBC.SELECTION_SHIFT.send(player); } catch (RegionOperationException e) { player.printError(e.getMessage()); @@ -519,17 +527,17 @@ public class SelectionCommands { } @Command( - aliases = {"/outset"}, - usage = "", - desc = "Outset the selection area", - help = - "Expands the selection by the given amount in all directions.\n" + - "Flags:\n" + - " -h only expand horizontally\n" + - " -v only expand vertically\n", - flags = "hv", - min = 1, - max = 1 + aliases = { "/outset" }, + usage = "", + desc = "Outset the selection area", + help = + "Expands the selection by the given amount in all directions.\n" + + "Flags:\n" + + " -h only expand horizontally\n" + + " -v only expand vertically\n", + flags = "hv", + min = 1, + max = 1 ) @Logging(REGION) @CommandPermissions("worldedit.selection.outset") @@ -542,17 +550,17 @@ public class SelectionCommands { } @Command( - aliases = {"/inset"}, - usage = "", - desc = "Inset the selection area", - help = - "Contracts the selection by the given amount in all directions.\n" + - "Flags:\n" + - " -h only contract horizontally\n" + - " -v only contract vertically\n", - flags = "hv", - min = 1, - max = 1 + aliases = { "/inset" }, + usage = "", + desc = "Inset the selection area", + help = + "Contracts the selection by the given amount in all directions.\n" + + "Flags:\n" + + " -h only contract horizontally\n" + + " -v only contract vertically\n", + flags = "hv", + min = 1, + max = 1 ) @Logging(REGION) @CommandPermissions("worldedit.selection.inset") @@ -569,33 +577,32 @@ public class SelectionCommands { int change = args.getInteger(0); if (!args.hasFlag('h')) { - changes.add((BlockVector3.at(0, 1, 0)).multiply(change)); - changes.add((BlockVector3.at(0, -1, 0)).multiply(change)); + changes.add((BlockVector3.UNIT_Y).multiply(change)); + changes.add((BlockVector3.UNIT_MINUS_Y).multiply(change)); } if (!args.hasFlag('v')) { - changes.add((BlockVector3.at(1, 0, 0)).multiply(change)); - changes.add((BlockVector3.at(-1, 0, 0)).multiply(change)); - changes.add((BlockVector3.at(0, 0, 1)).multiply(change)); - changes.add((BlockVector3.at(0, 0, -1)).multiply(change)); + changes.add((BlockVector3.UNIT_X).multiply(change)); + changes.add((BlockVector3.UNIT_MINUS_X).multiply(change)); + changes.add((BlockVector3.UNIT_Z).multiply(change)); + changes.add((BlockVector3.UNIT_MINUS_Z).multiply(change)); } return changes.toArray(new BlockVector3[0]); } @Command( - aliases = {"/size"}, - flags = "c", - usage = "", - desc = "Get information about the selection", - min = 0, - max = 0 + aliases = { "/size" }, + flags = "c", + usage = "", + desc = "Get information about the selection", + min = 0, + max = 0 ) @CommandPermissions("worldedit.selection.size") - public void size(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException { + public void size(Player player, LocalSession session, CommandContext args) throws WorldEditException { if (args.hasFlag('c')) { ClipboardHolder root = session.getClipboard(); -// Clipboard clipboard = holder.getClipboard(); int index = 0; for (ClipboardHolder holder : root.getHolders()) { Clipboard clipboard = holder.getClipboard(); @@ -668,12 +675,12 @@ public class SelectionCommands { @Command( - aliases = {"/count"}, - usage = "", - desc = "Counts the number of a certain type of block", - flags = "d", - min = 1, - max = 1 + aliases = { "/count" }, + usage = "", + flags = "d", + desc = "Counts the number of a certain type of block", + min = 1, + max = 1 ) @CommandPermissions("worldedit.analysis.count") public void count(Player player, LocalSession session, EditSession editSession, Mask mask) throws WorldEditException { @@ -682,23 +689,25 @@ public class SelectionCommands { } @Command( - aliases = {"/distr"}, - usage = "", - desc = "Get the distribution of blocks in the selection", - help = - "Gets the distribution of blocks in the selection.\n" + - "The -c flag gets the distribution of your clipboard.", - flags = "c", - min = 0, - max = 0 + aliases = { "/distr" }, + usage = "", + desc = "Get the distribution of blocks in the selection", + help = + "Gets the distribution of blocks in the selection.\n" + + "The -c flag gets the distribution of your clipboard.\n" + + "The -d flag separates blocks by state", + flags = "cd", + min = 0, + max = 0 ) @CommandPermissions("worldedit.analysis.distr") - public void distr(Player player, LocalSession session, EditSession editSession, @Switch('c') boolean useClipboard, @Switch('d') boolean useData) throws WorldEditException, CommandException { + public void distr(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException, CommandException { int size; List distributionData; + boolean separateStates = args.hasFlag('d'); Region region; - if (useClipboard) { + if (args.hasFlag('c')) { // TODO multi clipboard distribution Clipboard clipboard = session.getClipboard().getClipboard(); region = clipboard.getRegion(); @@ -706,13 +715,14 @@ public class SelectionCommands { } else { region = session.getSelection(player.getWorld()); } - if (useData) + if (separateStates) { distributionData = (List) editSession.getBlockDistributionWithData(region); - else + } else { distributionData = (List) editSession.getBlockDistribution(region); + } size = session.getSelection(player.getWorld()).getArea(); - if (distributionData.size() <= 0) { + if (distributionData.isEmpty()) { // *Should* always be false player.printError("No blocks counted."); return; } @@ -729,12 +739,12 @@ public class SelectionCommands { } @Command( - aliases = {"/sel", ";", "/desel", "/deselect"}, - flags = "d", - usage = "[cuboid|extend|poly|ellipsoid|sphere|cyl|convex]", - desc = "Choose a region selector", - min = 0, - max = 1 + aliases = { "/sel", ";", "/desel", "/deselect" }, + flags = "d", + usage = "[cuboid|extend|poly|ellipsoid|sphere|cyl|convex]", + desc = "Choose a region selector", + min = 0, + max = 1 ) public void select(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException { final World world = player.getWorld(); @@ -838,5 +848,4 @@ public class SelectionCommands { session.dispatchCUISelection(player); } - } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java index 178811dfa..308f42d6d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java @@ -56,7 +56,7 @@ public class SnapshotCommands { } @Command( - aliases = {"list"}, + aliases = { "list" }, usage = "[num]", desc = "List snapshots", min = 0, @@ -81,7 +81,7 @@ public class SnapshotCommands { BBC.SNAPSHOT_LIST_HEADER.send(player, player.getWorld().getName()); for (byte i = 0; i < Math.min(num, snapshots.size()); i++) { - player.print(BBC.getPrefix() + (i + 1) + ". " + snapshots.get(i).getName()); + player.print((i + 1) + ". " + snapshots.get(i).getName()); } BBC.SNAPSHOT_LIST_FOOTER.send(player); @@ -92,10 +92,10 @@ public class SnapshotCommands { File dir = config.snapshotRepo.getDirectory(); try { - WorldEdit.logger.info(BBC.getPrefix() + "WorldEdit found no snapshots: looked in: " + WorldEdit.logger.info("WorldEdit found no snapshots: looked in: " + dir.getCanonicalPath()); } catch (IOException e) { - WorldEdit.logger.info(BBC.getPrefix() + "WorldEdit found no snapshots: looked in " + WorldEdit.logger.info("WorldEdit found no snapshots: looked in " + "(NON-RESOLVABLE PATH - does it exist?): " + dir.getPath()); } @@ -222,7 +222,7 @@ public class SnapshotCommands { if (snapshot == null) { dateFormat.setTimeZone(session.getTimeZone()); - player.printError(BBC.getPrefix() + "Couldn't find a snapshot before " + player.printError("Couldn't find a snapshot before " + dateFormat.format(date.getTime()) + "."); } else { session.setSnapshot(snapshot); @@ -260,7 +260,7 @@ public class SnapshotCommands { Snapshot snapshot = config.snapshotRepo.getSnapshotAfter(date, player.getWorld().getName()); if (snapshot == null) { dateFormat.setTimeZone(session.getTimeZone()); - player.printError(BBC.getPrefix() + "Couldn't find a snapshot after " + player.printError("Couldn't find a snapshot after " + dateFormat.format(date.getTime()) + "."); } else { session.setSnapshot(snapshot); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java index 446277b9a..4f2c95f31 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java @@ -56,6 +56,7 @@ public class SnapshotUtilCommands { aliases = { "restore", "/restore" }, usage = "[snapshot]", desc = "Restore the selection from a snapshot", + min = 0, max = 1 ) @Logging(REGION) @@ -111,14 +112,20 @@ public class SnapshotUtilCommands { } } + ChunkStore chunkStore = null; // Load chunk store - SnapshotRestore restore; - try (ChunkStore chunkStore = snapshot.getChunkStore()) { + try { + chunkStore = snapshot.getChunkStore(); BBC.SNAPSHOT_LOADED.send(player, snapshot.getName()); + } catch (DataException | IOException e) { + player.printError("Failed to load snapshot: " + e.getMessage()); + return; + } + try { // Restore snapshot - restore = new SnapshotRestore(chunkStore, editSession, region); + SnapshotRestore restore = new SnapshotRestore(chunkStore, editSession, region); //player.print(restore.getChunksAffected() + " chunk(s) will be loaded."); restore.restore(); @@ -133,12 +140,15 @@ public class SnapshotUtilCommands { } } else { player.print(String.format("Restored; %d " - + "missing chunks and %d other errors.", + + "missing chunks and %d other errors.", restore.getMissingChunks().size(), restore.getErrorChunks().size())); } - } catch (DataException | IOException e) { - player.printError("Failed to load snapshot: " + e.getMessage()); + } finally { + try { + chunkStore.close(); + } catch (IOException ignored) { + } } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SuperPickaxeCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SuperPickaxeCommands.java index ce5f0054f..08a37900c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SuperPickaxeCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SuperPickaxeCommands.java @@ -41,11 +41,11 @@ public class SuperPickaxeCommands { } @Command( - aliases = {"single"}, - usage = "", - desc = "Enable the single block super pickaxe mode", - min = 0, - max = 0 + aliases = { "single" }, + usage = "", + desc = "Enable the single block super pickaxe mode", + min = 0, + max = 0 ) @CommandPermissions("worldedit.superpickaxe") public void single(Player player, LocalSession session) throws WorldEditException { @@ -56,11 +56,11 @@ public class SuperPickaxeCommands { } @Command( - aliases = {"area"}, - usage = "", - desc = "Enable the area super pickaxe pickaxe mode", - min = 1, - max = 1 + aliases = { "area" }, + usage = "", + desc = "Enable the area super pickaxe pickaxe mode", + min = 1, + max = 1 ) @CommandPermissions("worldedit.superpickaxe.area") public void area(Player player, LocalSession session, CommandContext args) throws WorldEditException { @@ -79,11 +79,11 @@ public class SuperPickaxeCommands { } @Command( - aliases = {"recur", "recursive"}, - usage = "", - desc = "Enable the recursive super pickaxe pickaxe mode", - min = 1, - max = 1 + aliases = { "recur", "recursive" }, + usage = "", + desc = "Enable the recursive super pickaxe pickaxe mode", + min = 1, + max = 1 ) @CommandPermissions("worldedit.superpickaxe.recursive") public void recursive(Player player, LocalSession session, CommandContext args) throws WorldEditException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java index 2d9e6c62e..5ba418051 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java @@ -60,16 +60,17 @@ public class ToolCommands { } @Command( - aliases = {"info", "/info"}, - usage = "", - desc = "Block information tool", - min = 0, - max = 0 + aliases = { "info", "/info" }, + usage = "", + desc = "Block information tool", + min = 0, + max = 0 ) @CommandPermissions("worldedit.tool.info") public void info(Player player, LocalSession session) throws WorldEditException { - session.setTool(new QueryTool(), player); + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(itemStack.getType(), new QueryTool()); BBC.TOOL_INFO.send(player, itemStack.getType().getName()); } @@ -77,104 +78,114 @@ public class ToolCommands { aliases = {"inspect"}, usage = "", desc = "Inspect edits within a radius", - help = - "Chooses the inspect brush", + help = "Chooses the inspect brush", min = 0, max = 0 ) @CommandPermissions("worldedit.tool.inspect") public void inspectBrush(Player player, LocalSession session, @Optional("1") double radius) throws WorldEditException { - session.setTool(new InspectBrush(), player); - BBC.TOOL_INSPECT.send(player, player.getItemInHand(HandSide.MAIN_HAND).getType().getName()); + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(itemStack.getType(), new InspectBrush()); + BBC.TOOL_INSPECT.send(player, itemStack.getType().getName()); } @Command( - aliases = {"tree"}, - usage = "[type]", - desc = "Tree generator tool", - min = 0, - max = 1 + aliases = { "tree" }, + usage = "[type]", + desc = "Tree generator tool", + min = 0, + max = 1 ) @CommandPermissions("worldedit.tool.tree") - @SuppressWarnings("deprecation") public void tree(Player player, LocalSession session, @Optional("tree") TreeGenerator.TreeType type, CommandContext args) throws WorldEditException { - session.setTool(new TreePlanter(type), player); - BBC.TOOL_TREE.send(player, player.getItemInHand(HandSide.MAIN_HAND).getType().getName()); + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(itemStack.getType(), new TreePlanter(type)); + BBC.TOOL_TREE.send(player, itemStack.getType().getName()); } @Command( - aliases = {"repl"}, - usage = "", - desc = "Block replacer tool", - min = 1, - max = 1 + aliases = { "repl" }, + usage = "", + desc = "Block replacer tool", + min = 1, + max = 1 ) @CommandPermissions("worldedit.tool.replacer") public void repl(Player player, LocalSession session, Pattern pattern) throws WorldEditException { - session.setTool(new BlockReplacer(pattern), player); - BBC.TOOL_REPL.send(player, player.getItemInHand(HandSide.MAIN_HAND).getType().getName()); + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(itemStack.getType(), new BlockReplacer(pattern)); + BBC.TOOL_REPL.send(player, itemStack.getType().getName()); } @Command( - aliases = {"cycler"}, - usage = "", - desc = "Block data cycler tool", - min = 0, - max = 0 + aliases = { "cycler" }, + usage = "", + desc = "Block data cycler tool", + min = 0, + max = 0 ) @CommandPermissions("worldedit.tool.data-cycler") public void cycler(Player player, LocalSession session) throws WorldEditException { - session.setTool(new BlockDataCyler(), player); - BBC.TOOL_CYCLER.send(player, player.getItemInHand(HandSide.MAIN_HAND).getType().getName()); + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(itemStack.getType(), new BlockDataCyler()); + BBC.TOOL_CYCLER.send(player, itemStack.getType().getName()); } @Command( - aliases = {"floodfill", "flood"}, - usage = " ", - desc = "Flood fill tool", - min = 2, - max = 2 + aliases = { "floodfill", "flood" }, + usage = " ", + desc = "Flood fill tool", + min = 2, + max = 2 ) @CommandPermissions("worldedit.tool.flood-fill") - public void floodFill(Player player, EditSession editSession, LocalSession session, Pattern pattern, int range) throws WorldEditException { + public void floodFill(Player player, LocalSession session, Pattern pattern, int range) throws WorldEditException { + LocalConfiguration config = we.getConfiguration(); + if (range > config.maxSuperPickaxeSize) { BBC.TOOL_RANGE_ERROR.send(player, config.maxSuperPickaxeSize); return; } - session.setTool(new FloodFillTool(range, pattern), player); - BBC.TOOL_FLOOD_FILL.send(player, player.getItemInHand(HandSide.MAIN_HAND).getType().getName()); + + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(itemStack.getType(), new FloodFillTool(range, pattern)); + BBC.TOOL_FLOOD_FILL.send(player, itemStack.getType().getName()); } @Command( - aliases = {"deltree"}, + aliases = { "deltree" }, usage = "", desc = "Floating tree remover tool", min = 0, max = 0 ) @CommandPermissions("worldedit.tool.deltree") - public void deltree(Player player, LocalSession session, CommandContext args) throws WorldEditException { - session.setTool(new FloatingTreeRemover(), player); + public void deltree(Player player, LocalSession session) throws WorldEditException { + + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(itemStack.getType(), new FloatingTreeRemover()); BBC.TOOL_DELTREE.send(player, player.getItemInHand(HandSide.MAIN_HAND).getType().getName()); } @Command( - aliases = {"farwand"}, + aliases = { "farwand" }, usage = "", desc = "Wand at a distance tool", min = 0, max = 0 ) @CommandPermissions("worldedit.tool.farwand") - public void farwand(Player player, LocalSession session, CommandContext args) throws WorldEditException { - session.setTool(new DistanceWand(), player); - BBC.TOOL_FARWAND.send(player, player.getItemInHand(HandSide.MAIN_HAND).getType().getName()); + public void farwand(Player player, LocalSession session) throws WorldEditException { + + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(itemStack.getType(), new DistanceWand()); + BBC.TOOL_FARWAND.send(player, itemStack.getType().getName()); } @Command( - aliases = {"lrbuild", "/lrbuild"}, + aliases = { "lrbuild", "/lrbuild" }, usage = " ", desc = "Long-range building tool", min = 2, @@ -182,8 +193,10 @@ public class ToolCommands { ) @CommandPermissions("worldedit.tool.lrbuild") public void longrangebuildtool(Player player, LocalSession session, Pattern secondary, Pattern primary) throws WorldEditException { - session.setTool(new LongRangeBuildTool(primary, secondary), player); - BBC.TOOL_LRBUILD_BOUND.send(player, player.getItemInHand(HandSide.MAIN_HAND).getType().getName()); + BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); + + session.setTool(itemStack.getType(), new LongRangeBuildTool(primary, secondary)); + BBC.TOOL_LRBUILD_BOUND.send(player, itemStack.getType().getName()); BBC.TOOL_LRBUILD_INFO.send(player, secondary, primary); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java index 4d2258064..3e77d232e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java @@ -56,7 +56,7 @@ public class ToolUtilCommands { String newState = args.getString(0, null); if (session.hasSuperPickAxe()) { if ("on".equals(newState)) { - player.printError(BBC.getPrefix() + "Super pick axe already enabled."); + player.printError("Super pick axe already enabled."); return; } @@ -64,7 +64,7 @@ public class ToolUtilCommands { player.print("Super pick axe disabled."); } else { if ("off".equals(newState)) { - player.printError(BBC.getPrefix() + "Super pick axe already disabled."); + player.printError("Super pick axe already disabled."); return; } session.enableSuperPickAxe(); @@ -130,6 +130,7 @@ public class ToolUtilCommands { int radius = args.getInteger(0); we.checkMaxBrushRadius(radius); + session.getBrushTool(player.getItemInHand(HandSide.MAIN_HAND).getType()).setSize(radius); player.print("Brush size set."); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java index 3e1be3564..89223fde9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java @@ -110,7 +110,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"patterns"}, + aliases = { "patterns" }, usage = "[page=1|search|pattern]", desc = "View help about patterns", help = "Patterns determine what blocks are placed\n" + @@ -125,7 +125,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"masks"}, + aliases = { "masks" }, usage = "[page=1|search|mask]", desc = "View help about masks", help = "Masks determine if a block can be placed\n" + @@ -141,7 +141,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"transforms"}, + aliases = { "transforms" }, usage = "[page=1|search|transform]", desc = "View help about transforms", help = "Transforms modify how a block is placed\n" + @@ -179,7 +179,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/heightmapinterface"}, + aliases = { "/heightmapinterface" }, desc = "Generate the heightmap interface: https://github.com/boy0001/HeightMap" ) @CommandPermissions("fawe.admin") @@ -237,7 +237,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/cancel", "fcancel"}, + aliases = { "/cancel", "fcancel" }, desc = "Cancel your current command", max = 0, queued = false @@ -248,11 +248,11 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/fill"}, - usage = " [depth] [direction]", - desc = "Fill a hole", - min = 2, - max = 4 + aliases = { "/fill" }, + usage = " [depth] [direction]", + desc = "Fill a hole", + min = 2, + max = 4 ) @CommandPermissions("worldedit.fill") @Logging(PLACEMENT) @@ -261,15 +261,15 @@ public class UtilityCommands extends MethodCommands { BlockVector3 pos = session.getPlacementPosition(player); int affected; affected = editSession.fillDirection(pos, pattern, radius, (int) depth, direction); - player.print(BBC.getPrefix() + affected + " block(s) have been created."); + player.print(affected + " block(s) have been created."); } @Command( - aliases = {"/fillr"}, - usage = " [depth]", - desc = "Fill a hole recursively", - min = 2, - max = 3 + aliases = { "/fillr" }, + usage = " [depth]", + desc = "Fill a hole recursively", + min = 2, + max = 3 ) @CommandPermissions("worldedit.fill.recursive") @Logging(PLACEMENT) @@ -278,11 +278,11 @@ public class UtilityCommands extends MethodCommands { BlockVector3 pos = session.getPlacementPosition(player); if (depth == -1) depth = Integer.MAX_VALUE; int affected = editSession.fillXZ(pos, pattern, radius, (int) depth, true); - player.print(BBC.getPrefix() + affected + " block(s) have been created."); + player.print(affected + " block(s) have been created."); } @Command( - aliases = {"/drain"}, + aliases = { "/drain" }, usage = "", desc = "Drain a pool", min = 1, @@ -294,31 +294,31 @@ public class UtilityCommands extends MethodCommands { worldEdit.checkMaxRadius(radius); int affected = editSession.drainArea( session.getPlacementPosition(player), radius); - player.print(BBC.getPrefix() + affected + " block(s) have been changed."); + player.print(affected + " block(s) have been changed."); } @Command( - aliases = {"/fixlava", "fixlava"}, - usage = "", - desc = "Fix lava to be stationary", - min = 1, - max = 1 + aliases = { "/fixlava", "fixlava" }, + usage = "", + desc = "Fix lava to be stationary", + min = 1, + max = 1 ) @CommandPermissions("worldedit.fixlava") @Logging(PLACEMENT) public void fixLava(Player player, LocalSession session, EditSession editSession, @Range(min = 0) double radius) throws WorldEditException { + worldEdit.checkMaxRadius(radius); - int affected = editSession.fixLiquid( - session.getPlacementPosition(player), radius, BlockTypes.LAVA); - player.print(BBC.getPrefix() + affected + " block(s) have been changed."); + int affected = editSession.fixLiquid(session.getPlacementPosition(player), radius, BlockTypes.LAVA); + player.print(affected + " block(s) have been changed."); } @Command( - aliases = {"/fixwater", "fixwater"}, - usage = "", - desc = "Fix water to be stationary", - min = 1, - max = 1 + aliases = { "/fixwater", "fixwater" }, + usage = "", + desc = "Fix water to be stationary", + min = 1, + max = 1 ) @CommandPermissions("worldedit.fixwater") @Logging(PLACEMENT) @@ -330,11 +330,11 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/removeabove", "removeabove"}, - usage = "[size] [height]", - desc = "Remove blocks above your head.", - min = 0, - max = 2 + aliases = { "/removeabove", "removeabove" }, + usage = "[size] [height]", + desc = "Remove blocks above your head.", + min = 0, + max = 2 ) @CommandPermissions("worldedit.removeabove") @Logging(PLACEMENT) @@ -345,11 +345,11 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/removebelow", "removebelow"}, - usage = "[size] [height]", - desc = "Remove blocks below you.", - min = 0, - max = 2 + aliases = { "/removebelow", "removebelow" }, + usage = "[size] [height]", + desc = "Remove blocks below you.", + min = 0, + max = 2 ) @CommandPermissions("worldedit.removebelow") @Logging(PLACEMENT) @@ -360,11 +360,11 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/removenear", "removenear"}, - usage = " [size]", - desc = "Remove blocks near you.", - min = 1, - max = 2 + aliases = { "/removenear", "removenear" }, + usage = " [size]", + desc = "Remove blocks near you.", + min = 1, + max = 2 ) @CommandPermissions("worldedit.removenear") @Logging(PLACEMENT) @@ -376,12 +376,12 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/replacenear", "replacenear"}, - usage = " ", - desc = "Replace nearby blocks", - flags = "f", - min = 3, - max = 3 + aliases = { "/replacenear", "replacenear" }, + usage = " ", + desc = "Replace nearby blocks", + flags = "f", + min = 3, + max = 3 ) @CommandPermissions("worldedit.replacenear") @Logging(PLACEMENT) @@ -400,11 +400,11 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/snow", "snow"}, - usage = "[radius]", - desc = "Simulates snow", - min = 0, - max = 1 + aliases = { "/snow", "snow" }, + usage = "[radius]", + desc = "Simulates snow", + min = 0, + max = 1 ) @CommandPermissions("worldedit.snow") @Logging(PLACEMENT) @@ -413,11 +413,11 @@ public class UtilityCommands extends MethodCommands { we.checkMaxRadius(size); int affected = editSession.simulateSnow(session.getPlacementPosition(player), size); - player.print(BBC.getPrefix() + affected + " surfaces covered. Let it snow~"); + player.print(affected + " surfaces covered. Let it snow~"); } @Command( - aliases = {"/thaw", "thaw"}, + aliases = { "/thaw", "thaw" }, usage = "[radius]", desc = "Thaws the area", min = 0, @@ -430,11 +430,11 @@ public class UtilityCommands extends MethodCommands { we.checkMaxRadius(size); int affected = editSession.thaw(session.getPlacementPosition(player), size); - player.print(BBC.getPrefix() + affected + " surfaces thawed."); + player.print(affected + " surfaces thawed."); } @Command( - aliases = {"/green", "green"}, + aliases = { "/green", "green" }, usage = "[radius]", desc = "Greens the area", help = "Converts dirt to grass blocks. -f also converts coarse dirt.", @@ -454,7 +454,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/ex", "/ext", "/extinguish", "ex", "ext", "extinguish"}, + aliases = { "/ex", "/ext", "/extinguish", "ex", "ext", "extinguish" }, usage = "[radius]", desc = "Extinguish nearby fire", min = 0, @@ -476,7 +476,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"butcher"}, + aliases = { "butcher" }, usage = "[radius]", flags = "plangbtfr", desc = "Kill all or nearby mobs", @@ -562,7 +562,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"remove", "rem", "rement"}, + aliases = { "remove", "rem", "rement" }, usage = " ", desc = "Remove all entities of a type", min = 2, @@ -622,7 +622,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/calc", "/calculate", "/eval", "/evaluate", "/solve"}, + aliases = { "/calc", "/calculate", "/eval", "/evaluate", "/solve" }, usage = "", desc = "Evaluate a mathematical expression" ) @@ -646,7 +646,7 @@ public class UtilityCommands extends MethodCommands { } executor.shutdownNow(); - actor.print(BBC.getPrefix() + "= " + result); + actor.print("= " + result); } catch (EvaluationException e) { actor.printError(String.format( "'%s' could not be evaluated (error: %s)", input, e.getMessage())); @@ -657,7 +657,7 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/confirm"}, + aliases = { "/confirm" }, desc = "Confirm a command" ) public void confirm(FawePlayer fp) throws WorldEditException { @@ -667,13 +667,14 @@ public class UtilityCommands extends MethodCommands { } @Command( - aliases = {"/help"}, + aliases = { "/help" }, usage = "[]", desc = "Displays help for WorldEdit commands", min = 0, max = -1, queued = false ) + @CommandPermissions("worldedit.help") public void help(Actor actor, CommandContext args) throws WorldEditException { help(args, worldEdit, actor); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java index b6d7c7838..6851fe2b2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java @@ -1,12 +1,31 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + package com.sk89q.worldedit.command.tool; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; -import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.World; @@ -30,11 +49,11 @@ public class AreaPickaxe implements BlockTool { } @Override - public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { + public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, com.sk89q.worldedit.util.Location clicked) { int ox = clicked.getBlockX(); int oy = clicked.getBlockY(); int oz = clicked.getBlockZ(); - BlockType initialType = clicked.getExtent().getBlock(clicked.toBlockPoint()).getBlockType(); + BlockType initialType = clicked.getExtent().getBlock(clicked.toVector().toBlockPoint()).getBlockType(); if (initialType.getMaterial().isAir()) { return true; @@ -45,8 +64,9 @@ public class AreaPickaxe implements BlockTool { } try (EditSession editSession = session.createEditSession(player)) { + editSession.getSurvivalExtent().setToolUse(config.superPickaxeManyDrop); + try { - editSession.getSurvivalExtent().setToolUse(config.superPickaxeManyDrop); for (int x = ox - range; x <= ox + range; ++x) { for (int z = oz - range; z <= oz + range; ++z) { for (int y = oy + range; y >= oy - range; --y) { @@ -58,10 +78,14 @@ public class AreaPickaxe implements BlockTool { } } editSession.flushQueue(); + } catch (MaxChangedBlocksException e) { + player.printError("Max blocks change limit reached."); } finally { session.remember(editSession); } } + return true; } + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java index 5591d341d..0e983f20d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java @@ -56,8 +56,7 @@ public class BlockDataCyler implements DoubleActionBlockTool { World world = (World) clicked.getExtent(); -// BlockStateHolder block = world.getBlock(clicked); - BlockVector3 blockPoint = clicked.toBlockPoint(); + BlockVector3 blockPoint = clicked.toVector().toBlockPoint(); BlockState block = world.getBlock(blockPoint); if (!config.allowedDataCycleBlocks.isEmpty() @@ -68,42 +67,42 @@ public class BlockDataCyler implements DoubleActionBlockTool { } if (block.getStates().keySet().isEmpty()) { - BBC.BLOCK_CYCLER_CANNOT_CYCLE.send(player); + BBC.BLOCK_CYCLER_CANNOT_CYCLE.send(player); } else { - Property currentProperty = selectedProperties.get(player.getUniqueId()); - - if (currentProperty == null || (forward && block.getState(currentProperty) == null)) { - currentProperty = block.getStates().keySet().stream().findFirst().get(); - selectedProperties.put(player.getUniqueId(), currentProperty); - } - - if (forward) { - block.getState(currentProperty); - int index = currentProperty.getValues().indexOf(block.getState(currentProperty)); - index = (index + 1) % currentProperty.getValues().size(); - @SuppressWarnings("unchecked") - Property objProp = (Property) currentProperty; - BlockState newBlock = block.with(objProp, currentProperty.getValues().get(index)); - - try { - EditSession editSession = session.createEditSession(player); - try { - editSession.setBlock(blockPoint, newBlock); - player.print(BBC.getPrefix() + "Value of " + currentProperty.getName() + " is now " + currentProperty.getValues().get(index).toString()); - } catch (MaxChangedBlocksException e) { - BBC.BLOCK_CYCLER_LIMIT.send(player); - } finally { - session.remember(editSession); - } - }catch (Exception e) {} - } else { - List> properties = Lists.newArrayList(block.getStates().keySet()); - int index = properties.indexOf(currentProperty); - index = (index + 1) % properties.size(); - currentProperty = properties.get(index); - selectedProperties.put(player.getUniqueId(), currentProperty); - player.print(BBC.getPrefix() + "Now cycling " + currentProperty.getName()); - } + Property currentProperty = selectedProperties.get(player.getUniqueId()); + + if (currentProperty == null || (forward && block.getState(currentProperty) == null)) { + currentProperty = block.getStates().keySet().stream().findFirst().get(); + selectedProperties.put(player.getUniqueId(), currentProperty); + } + + if (forward) { + block.getState(currentProperty); + int index = currentProperty.getValues().indexOf(block.getState(currentProperty)); + index = (index + 1) % currentProperty.getValues().size(); + @SuppressWarnings("unchecked") + Property objProp = (Property) currentProperty; + BlockState newBlock = block.with(objProp, currentProperty.getValues().get(index)); + + try (EditSession editSession = session.createEditSession(player)) { + try { + editSession.setBlock(blockPoint, newBlock); + player.print("Value of " + currentProperty.getName() + " is now " + currentProperty.getValues().get(index).toString()); + } catch (MaxChangedBlocksException e) { + BBC.BLOCK_CYCLER_LIMIT.send(player); + } finally { + session.remember(editSession); + } + } catch (Exception e) { + } + } else { + List> properties = Lists.newArrayList(block.getStates().keySet()); + int index = properties.indexOf(currentProperty); + index = (index + 1) % properties.size(); + currentProperty = properties.get(index); + selectedProperties.put(player.getUniqueId(), currentProperty); + player.print("Now cycling " + currentProperty.getName()); + } } return true; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java index fe6589777..9964cd62a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.BBC; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; @@ -32,10 +31,9 @@ import com.sk89q.worldedit.function.pattern.BlockPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.world.block.BlockType; /** + * A mode that replaces one block. */ public class BlockReplacer implements DoubleActionBlockTool { @@ -74,13 +72,11 @@ public class BlockReplacer implements DoubleActionBlockTool { @Override public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, com.sk89q.worldedit.util.Location clicked) { - EditSession editSession = session.createEditSession(player); - BlockStateHolder targetBlock = (editSession).getBlock(clicked.toBlockPoint()); - BlockType type = targetBlock.getBlockType(); + BlockState targetBlock = player.getWorld().getBlock(clicked.toVector().toBlockPoint()); - if (type != null) { - this.pattern = targetBlock; - player.print(BBC.getPrefix() + "Replacer tool switched to: " + type.getName()); + if (targetBlock != null) { + pattern = new BlockPattern(targetBlock); + player.print("Replacer tool switched to: " + targetBlock.getBlockType().getName()); } return true; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java index 5e5274b90..1b05c8f6b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java @@ -1,3 +1,22 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + package com.sk89q.worldedit.command.tool; import com.boydti.fawe.Fawe; @@ -244,15 +263,6 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool return getContext().getMask(); } - /** - * Get the filter. - * - * @return the filter - */ - public Mask getSourceMask() { - return getContext().getSourceMask(); - } - @Override public boolean reset() { Brush br = getBrush(); @@ -285,7 +295,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool /** * Set the brush. * - * @param brush tbe brush + * @param brush tbe brush * @param permission the permission */ @Deprecated @@ -327,8 +337,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool * * @return the material */ - @Nullable - public Pattern getMaterial() { + @Nullable public Pattern getMaterial() { return getContext().getMaterial(); } @@ -424,8 +433,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool return TaskManager.IMP.sync(new RunnableVal() { @Override public void run(Vector3 value) { - Location result = tb.getMaskedTargetBlock(useLastBlock); - this.value = result; + this.value = tb.getMaskedTargetBlock(useLastBlock); } }); } @@ -458,6 +466,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool BBC.NO_BLOCK.send(player); return false; } + BlockBag bag = session.getBlockBag(player); Request.request().setEditSession(editSession); Mask mask = current.getMask(); @@ -487,7 +496,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool double size = current.getSize(); WorldEdit.getInstance().checkMaxBrushRadius(size); brush.build(editSession, target, current.getMaterial(), size); - } catch (WorldEditException e) { + } catch (MaxChangedBlocksException e) { player.printError("Max blocks change limit reached."); // Never happens } finally { if (bag != null) { @@ -510,12 +519,6 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool } - - public void setScrollAction(ScrollAction scrollAction) { - this.getContext().setScrollAction(scrollAction); - update(); - } - public void setTargetOffset(int targetOffset) { this.targetOffset = targetOffset; update(); @@ -557,10 +560,6 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool return targetOffset; } - public Mask getTargetMask() { - return targetMask; - } - public VisualMode getVisualMode() { return visualMode; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java index 8f43fce0e..e09be2e4b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java @@ -69,7 +69,7 @@ public class DistanceWand extends BrushTool implements DoubleActionTraceTool { if (target == null) return true; RegionSelector selector = session.getRegionSelector(player.getWorld()); - BlockVector3 blockPoint = target.toBlockPoint(); + BlockVector3 blockPoint = target.toVector().toBlockPoint(); if (selector.selectSecondary(blockPoint, ActorSelectorLimits.forActor(player))) { selector.explainSecondarySelection(player, session, blockPoint); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java index 39c27845d..9890b54ee 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.object.collection.BlockVectorSet; import com.boydti.fawe.config.BBC; import com.boydti.fawe.object.collection.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; @@ -38,9 +37,7 @@ import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; -import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.Set; /** @@ -70,7 +67,7 @@ public class FloatingTreeRemover implements BlockTool { @Override public boolean actPrimary(Platform server, LocalConfiguration config, - Player player, LocalSession session, Location clicked) { + Player player, LocalSession session, Location clicked) { final World world = (World) clicked.getExtent(); final BlockState state = world.getBlock(clicked.toVector().toBlockPoint()); @@ -121,7 +118,7 @@ public class FloatingTreeRemover implements BlockTool { * @return a set containing all blocks in the tree/shroom or null if this is not a floating tree/shroom. */ private Set bfs(World world, BlockVector3 origin) throws MaxChangedBlocksException { - final LocalBlockVectorSet visited = new LocalBlockVectorSet(); + final Set visited = new LocalBlockVectorSet(); final LocalBlockVectorSet queue = new LocalBlockVectorSet(); queue.add(origin); @@ -161,4 +158,4 @@ public class FloatingTreeRemover implements BlockTool { return visited; } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java index 594beb60b..749641667 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java @@ -64,7 +64,7 @@ public class FloodFillTool implements BlockTool { public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { World world = (World) clicked.getExtent(); - BlockVector3 origin = clicked.toBlockPoint(); + BlockVector3 origin = clicked.toVector().toBlockPoint(); BlockType initialType = world.getBlock(origin).getBlockType(); if (initialType.getMaterial().isAir()) { @@ -88,6 +88,7 @@ public class FloodFillTool implements BlockTool { session.remember(editSession); } } + return true; } @@ -120,5 +121,4 @@ public class FloodFillTool implements BlockTool { origin, size, initialType, visited); } - -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java index be256f239..c51af3d75 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java @@ -1,9 +1,29 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + package com.sk89q.worldedit.command.tool; import com.boydti.fawe.object.mask.IdMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; @@ -17,11 +37,14 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; +import java.util.Set; + /** * A pickaxe mode that recursively finds adjacent blocks within range of * an initial block and of the same type. */ public class RecursivePickaxe implements BlockTool { + private double range; public RecursivePickaxe(double range) { @@ -36,32 +59,66 @@ public class RecursivePickaxe implements BlockTool { @Override public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, com.sk89q.worldedit.util.Location clicked) { World world = (World) clicked.getExtent(); - final BlockVector3 pos = clicked.toBlockPoint(); - EditSession editSession = session.createEditSession(player); BlockVector3 origin = clicked.toBlockPoint(); BlockType initialType = world.getBlock(origin).getBlockType(); - BlockStateHolder block = editSession.getBlock(pos); - if (block.getBlockType().getMaterial().isAir()) { + if (initialType.getMaterial().isAir()) { return true; } - if (block.getBlockType() == BlockTypes.BEDROCK && !player.canDestroyBedrock()) { + if (initialType == BlockTypes.BEDROCK && !player.canDestroyBedrock()) { return true; } - editSession.getSurvivalExtent().setToolUse(config.superPickaxeManyDrop); + try (EditSession editSession = session.createEditSession(player)) { + editSession.getSurvivalExtent().setToolUse(config.superPickaxeManyDrop); - final int radius = (int) range; - final BlockReplace replace = new BlockReplace(editSession, (editSession.nullBlock)); - editSession.setMask((Mask) null); - RecursiveVisitor visitor = new RecursiveVisitor(new IdMask(editSession), replace, radius, editSession); - visitor.visit(pos); - Operations.completeBlindly(visitor); + final int radius = (int) range; + final BlockReplace replace = new BlockReplace(editSession, (editSession.nullBlock)); + editSession.setMask((Mask) null); + RecursiveVisitor visitor = new RecursiveVisitor(new IdMask(editSession), replace, radius, editSession); + visitor.visit(clicked.toBlockPoint()); + Operations.completeBlindly(visitor); + + editSession.flushQueue(); + session.remember(editSession); + player.printError("Max blocks change limit reached."); + } - editSession.flushQueue(); - session.remember(editSession); return true; } -} \ No newline at end of file + + private static void recurse(Platform server, EditSession editSession, World world, BlockVector3 pos, + BlockVector3 origin, double size, BlockType initialType, Set visited) throws MaxChangedBlocksException { + + final double distanceSq = origin.distanceSq(pos); + if (distanceSq > size*size || visited.contains(pos)) { + return; + } + + visited.add(pos); + + if (editSession.getBlock(pos).getBlockType() != initialType) { + return; + } + + world.queueBlockBreakEffect(server, pos, initialType, distanceSq); + + editSession.setBlock(pos, BlockTypes.AIR.getDefaultState()); + + recurse(server, editSession, world, pos.add(1, 0, 0), + origin, size, initialType, visited); + recurse(server, editSession, world, pos.add(-1, 0, 0), + origin, size, initialType, visited); + recurse(server, editSession, world, pos.add(0, 0, 1), + origin, size, initialType, visited); + recurse(server, editSession, world, pos.add(0, 0, -1), + origin, size, initialType, visited); + recurse(server, editSession, world, pos.add(0, 1, 0), + origin, size, initialType, visited); + recurse(server, editSession, world, pos.add(0, -1, 0), + origin, size, initialType, visited); + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowCylinderBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowCylinderBrush.java index d96a44819..dbf959e1b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowCylinderBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowCylinderBrush.java @@ -37,7 +37,7 @@ public class HollowCylinderBrush implements Brush { @Override public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws MaxChangedBlocksException { if (pattern == null) { - pattern = (BlockTypes.COBBLESTONE.getDefaultState()); + pattern = new BlockPattern(BlockTypes.COBBLESTONE.getDefaultState()); } editSession.makeCylinder(position, pattern, size, size, height, false); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowSphereBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowSphereBrush.java index bbba333b3..0e89b3c16 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowSphereBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowSphereBrush.java @@ -31,7 +31,7 @@ public class HollowSphereBrush implements Brush { @Override public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws MaxChangedBlocksException { if (pattern == null) { - pattern = (BlockTypes.COBBLESTONE.getDefaultState()); + pattern = new BlockPattern(BlockTypes.COBBLESTONE.getDefaultState()); } editSession.makeSphere(position, pattern, size, size, size, false); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SmoothBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SmoothBrush.java index 66a73112b..2ecf245d1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SmoothBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SmoothBrush.java @@ -53,7 +53,7 @@ public class SmoothBrush implements Brush { Vector3 posDouble = position.toVector3(); Location min = new Location(editSession.getWorld(), posDouble.subtract(size, size, size)); BlockVector3 max = posDouble.add(size, size + 10, size).toBlockPoint(); - Region region = new CuboidRegion(editSession.getWorld(), min.toBlockPoint(), max); + Region region = new CuboidRegion(editSession.getWorld(), min.toVector().toBlockPoint(), max); HeightMap heightMap = new HeightMap(editSession, region, mask); HeightMapFilter filter = new HeightMapFilter(new GaussianKernel(5, 1.0)); heightMap.applyFilter(filter, iterations); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SphereBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SphereBrush.java index 07e852da6..d8028f2ae 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SphereBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SphereBrush.java @@ -31,7 +31,7 @@ public class SphereBrush implements Brush { @Override public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws MaxChangedBlocksException { if (pattern == null) { - pattern = (BlockTypes.COBBLESTONE.getDefaultState()); + pattern = new BlockPattern(BlockTypes.COBBLESTONE.getDefaultState()); } editSession.makeSphere(position, pattern, size, size, size, true); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/EditSessionEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/EditSessionEvent.java index c94ba677a..cc32d4fd8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/EditSessionEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/EditSessionEvent.java @@ -19,6 +19,9 @@ package com.sk89q.worldedit.event.extent; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.sk89q.worldedit.EditSession.Stage; + import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.event.Cancellable; import com.sk89q.worldedit.event.Event; @@ -28,24 +31,20 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.World; import javax.annotation.Nullable; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.sk89q.worldedit.EditSession.Stage; - /** * Raised (several times) when a new {@link EditSession} is being instantiated. - *

+ * *

Block loggers, as well as block set interceptors, can use this event to wrap * the given {@link Extent} with their own, which would allow them to intercept * all changes made to the world. For example, the code below would wrap the * existing extent with a custom one, and the custom extent would receive * all method calls before the extent fetched from * {@link #getExtent()} would.

- *

+ * *

  * event.setExtent(new MyExtent(event.getExtent())
  * 
- *

+ * *

This event is fired several times during the creation of a single * {@link EditSession}, but {@link #getStage()} will differ each time. * The stage determines at which point {@link Extent}s added to this event @@ -72,10 +71,10 @@ public class EditSessionEvent extends Event implements Cancellable { /** * Create a new event. * - * @param world the world - * @param actor the actor, or null if there is no actor specified + * @param world the world + * @param actor the actor, or null if there is no actor specified * @param maxBlocks the maximum number of block changes - * @param stage the stage + * @param stage the stage */ public EditSessionEvent(@Nullable World world, Actor actor, int maxBlocks, Stage stage) { this.world = world; @@ -97,9 +96,7 @@ public class EditSessionEvent extends Event implements Cancellable { * * @return the actor, which may be null if unavailable */ - public - @Nullable - Actor getActor() { + public @Nullable Actor getActor() { return actor; } @@ -108,9 +105,7 @@ public class EditSessionEvent extends Event implements Cancellable { * * @return the world */ - public - @Nullable - World getWorld() { + public @Nullable World getWorld() { return world; } @@ -169,10 +164,7 @@ public class EditSessionEvent extends Event implements Cancellable { * @return a new event */ public EditSessionEvent clone(Stage stage) { - EditSessionEvent clone = new EditSessionEvent(world, actor, maxBlocks, stage); - clone.setEditSession(session); - return clone; + return new EditSessionEvent(world, actor, maxBlocks, stage); } - } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java index d8dbe0a63..bcb2d8212 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java @@ -25,6 +25,7 @@ import com.boydti.fawe.jnbt.JSON2NBT; import com.boydti.fawe.jnbt.NBTException; import com.boydti.fawe.util.MathMan; import com.boydti.fawe.util.StringMan; + import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.NotABlockException; @@ -42,7 +43,6 @@ import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; -import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.extent.inventory.SlottableBlockBag; import com.sk89q.worldedit.internal.registry.InputParser; @@ -59,7 +59,6 @@ import com.sk89q.worldedit.world.block.FuzzyBlockState; import com.sk89q.worldedit.world.registry.LegacyMapper; import java.util.Arrays; -import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExpressionMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExpressionMaskParser.java index 58041280d..4e254109c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExpressionMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExpressionMaskParser.java @@ -55,7 +55,7 @@ public class ExpressionMaskParser extends InputParser { if (context.getActor() instanceof SessionOwner) { SessionOwner owner = (SessionOwner) context.getActor(); IntSupplier timeout = () -> WorldEdit.getInstance().getSessionManager().get(owner).getTimeout(); - // TODO timeout + return new ExpressionMask(exp, timeout); } return new ExpressionMask(exp); } catch (ExpressionException e) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java index 9cc922368..b2e9672f5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java @@ -69,10 +69,10 @@ public class BlockCategoryPatternParser extends InputParser { if (anyState) { blocks.stream().flatMap(blockType -> blockType.getAllStates().stream()).forEach(state -> - randomPattern.add((state), 1.0)); + randomPattern.add(new BlockPattern(state), 1.0)); } else { for (BlockType blockType : blocks) { - randomPattern.add((blockType.getDefaultState()), 1.0); + randomPattern.add(new BlockPattern(blockType.getDefaultState()), 1.0); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java index 1aee6c2a6..f0939ed60 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java @@ -83,4 +83,5 @@ public class ClipboardPatternParser extends InputParser { throw new InputParseException("No session is available, so no clipboard is available"); } } + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java index a836c1615..68c768954 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java @@ -21,7 +21,6 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; import com.sk89q.util.StringUtil; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.extension.factory.BlockFactory; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomStatePatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomStatePatternParser.java index f7d3117e2..9eb54eebe 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomStatePatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomStatePatternParser.java @@ -44,9 +44,9 @@ public class RandomStatePatternParser extends InputParser { context.setPreferringWildcard(wasFuzzy); if (block.getStates().size() == block.getBlockType().getPropertyMap().size()) { // they requested random with *, but didn't leave any states empty - simplify - return (block); + return new BlockPattern(block); } else { return null; // only should happen if parseLogic changes } } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/SingleBlockPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/SingleBlockPatternParser.java index 3ecf3a9ce..e71530a2e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/SingleBlockPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/SingleBlockPatternParser.java @@ -34,7 +34,7 @@ public class SingleBlockPatternParser extends InputParser { @Override public Pattern parseFromInput(String input, ParserContext context) throws InputParseException { - return (worldEdit.getBlockFactory().parseFromInput(input, context)); + return new BlockPattern(worldEdit.getBlockFactory().parseFromInput(input, context)); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java index 27cf4d6b9..e7aeac997 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java @@ -25,7 +25,6 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.cui.CUIEvent; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.HandSide; @@ -36,7 +35,6 @@ import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; -import com.sk89q.worldedit.world.block.BlockTypeUtil; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; @@ -102,22 +100,23 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { Extent world = searchPos.getExtent(); int x = searchPos.getBlockX(); int y = Math.max(0, searchPos.getBlockY()); + int origY = y; int z = searchPos.getBlockZ(); byte free = 0; - BlockVector3 mutablePos = MutableBlockVector3.at(0, 0, 0); while (y <= world.getMaximumPoint().getBlockY() + 2) { - if (!world.getBlock(mutablePos.setComponents(x, y, z)).getBlockType().getMaterial().isMovementBlocker()) { + if (!world.getBlock(BlockVector3.at(x, y, z)).getBlockType().getMaterial().isMovementBlocker()) { ++free; } else { free = 0; } if (free == 2) { - final BlockVector3 pos = mutablePos.setComponents(x, y - 2, z); - final BlockStateHolder state = world.getBlock(pos); - setPosition(new Location(world, Vector3.at(x + 0.5, y - 2 + BlockTypeUtil.centralTopLimit(state), z + 0.5))); + if (y - 1 != origY) { + setPosition(Vector3.at(x + 0.5, y - 2 + 1, z + 0.5)); + } + return; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java index 4bdd72c74..8a1de54ad 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java @@ -332,7 +332,9 @@ public class PlatformManager { return; } FawePlayer fp = FawePlayer.wrap(player); + RegionSelector selector = session.getRegionSelector(player.getWorld()); + final Player maskedPlayerWrapper = new LocationMaskedPlayerWrapper(PlayerWrapper.wrap((Player) actor), ((Player) actor).getLocation()); @@ -359,7 +361,8 @@ public class PlatformManager { return; } } - Tool tool = session.getTool(player); + + Tool tool = session.getTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); if (tool instanceof DoubleActionBlockTool) { if (tool.canUse(player)) { FawePlayer fp = FawePlayer.wrap(player); @@ -382,6 +385,7 @@ public class PlatformManager { } FawePlayer fp = FawePlayer.wrap(player); if (fp.checkAction()) { + RegionSelector selector = session.getRegionSelector(player.getWorld()); Player maskedPlayerWrapper = new LocationMaskedPlayerWrapper( PlayerWrapper.wrap((Player) actor), @@ -400,7 +404,7 @@ public class PlatformManager { return; } - Tool tool = session.getTool(player); + Tool tool = session.getTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); if (tool instanceof BlockTool) { if (tool.canUse(player)) { FawePlayer fp = FawePlayer.wrap(player); @@ -471,7 +475,7 @@ public class PlatformManager { return; } - Tool tool = session.getTool(player); + Tool tool = session.getTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); if (tool instanceof DoubleActionTraceTool) { if (tool.canUse(player)) { FawePlayer fp = FawePlayer.wrap(player); @@ -498,7 +502,7 @@ public class PlatformManager { return; } - Tool tool = session.getTool(player); + Tool tool = session.getTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); if (tool instanceof TraceTool) { if (tool.canUse(player)) { FawePlayer fp = FawePlayer.wrap(player); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java index be54386b0..8a8e71166 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java @@ -19,11 +19,11 @@ package com.sk89q.worldedit.extent; +import static com.google.common.base.Preconditions.checkNotNull; + import com.boydti.fawe.jnbt.anvil.generator.GenBase; import com.boydti.fawe.jnbt.anvil.generator.Resource; import com.boydti.fawe.object.extent.LightingExtent; -import static com.google.common.base.Preconditions.checkNotNull; - import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; @@ -41,7 +41,7 @@ import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; -import com.sk89q.worldedit.world.registry.BundledBlockData; + import java.util.List; import javax.annotation.Nullable; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/ChangeSetExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/ChangeSetExtent.java index 5a8f771f8..ba6fd0abd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/ChangeSetExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/ChangeSetExtent.java @@ -19,9 +19,6 @@ package com.sk89q.worldedit.extent; -import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.world.block.BlockState; import static com.google.common.base.Preconditions.checkNotNull; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java index b92caaa5f..57c6bf390 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java @@ -22,12 +22,10 @@ package com.sk89q.worldedit.extent; import static com.google.common.base.Preconditions.checkNotNull; import com.sk89q.worldedit.WorldEditException; - -import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockStateHolder; /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java index aeaf07e85..6994442fe 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java @@ -61,7 +61,7 @@ public interface Clipboard extends Extent { /** * Returns true if the clipboard has biome data. This can be checked since {@link Extent#getBiome(BlockVector2)} - * strongly suggests returning {@link com.sk89q.worldedit.world.biome.BiomeTypes.OCEAN} instead of {@code null} + * strongly suggests returning {@link com.sk89q.worldedit.world.biome.BiomeTypes#OCEAN} instead of {@code null} * if biomes aren't present. However, it might not be desired to set areas to ocean if the clipboard is defaulting * to ocean, instead of having biomes explicitly set. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java index 00e52e902..3997f28c7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java @@ -29,7 +29,6 @@ import com.sk89q.jnbt.ShortTag; import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java index e759af00a..a2277f5a5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java @@ -31,30 +31,19 @@ import com.boydti.fawe.object.clipboard.MemoryOptimizedClipboard; import com.boydti.fawe.object.io.FastByteArrayOutputStream; import com.boydti.fawe.object.io.FastByteArraysInputStream; import com.boydti.fawe.util.IOUtil; -import com.google.common.collect.Maps; -import com.sk89q.jnbt.ByteArrayTag; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntArrayTag; import com.sk89q.jnbt.IntTag; import com.sk89q.jnbt.ListTag; import com.sk89q.jnbt.NBTInputStream; -import com.sk89q.jnbt.NamedTag; -import com.sk89q.jnbt.ShortTag; import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.world.biome.BiomeTypes; -import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.extension.input.InputParseException; -import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.legacycompat.NBTCompatibilityHandler; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.world.biome.BiomeTypes; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.entity.EntityType; @@ -67,13 +56,11 @@ import org.slf4j.LoggerFactory; import java.io.DataInputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.function.BiConsumer; -import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkNotNull; @@ -110,7 +97,7 @@ public class SpongeSchematicReader extends NBTSchematicReader { public Clipboard read(UUID uuid) throws IOException { return readVersion1(uuid); } - + private int width, height, length; private int offsetX, offsetY, offsetZ; private char[] palette; @@ -132,8 +119,8 @@ public class SpongeSchematicReader extends NBTSchematicReader { return fc = new MemoryOptimizedClipboard(size, 1, 1); } } - - private Clipboard readVersion1(UUID uuid) throws IOException { + + private BlockArrayClipboard readVersion1(UUID uuid) throws IOException { width = height = length = offsetX = offsetY = offsetZ = Integer.MIN_VALUE; final BlockArrayClipboard clipboard = new BlockArrayClipboard(new CuboidRegion(BlockVector3.at(0, 0, 0), BlockVector3.at(0, 0, 0)), fc); @@ -176,39 +163,33 @@ public class SpongeSchematicReader extends NBTSchematicReader { } } }); - streamer.addReader("Schematic.TileEntities.#", new BiConsumer() { - @Override - public void accept(Integer index, CompoundTag value) { - if (fc == null) { - setupClipboard(0, uuid); - } - int[] pos = value.getIntArray("Pos"); - int x = pos[0]; - int y = pos[1]; - int z = pos[2]; - fc.setTile(x, y, z, value); + streamer.addReader("Schematic.TileEntities.#", (BiConsumer) (index, value) -> { + if (fc == null) { + setupClipboard(0, uuid); } + int[] pos = value.getIntArray("Pos"); + int x = pos[0]; + int y = pos[1]; + int z = pos[2]; + fc.setTile(x, y, z, value); }); - streamer.addReader("Schematic.Entities.#", new BiConsumer() { - @Override - public void accept(Integer index, CompoundTag compound) { - if (fc == null) { - setupClipboard(0, uuid); - } - String id = compound.getString("id"); - if (id.isEmpty()) { - return; - } - ListTag positionTag = compound.getListTag("Pos"); - ListTag directionTag = compound.getListTag("Rotation"); - EntityType type = EntityTypes.parse(id); - if (type != null) { - compound.getValue().put("Id", new StringTag(type.getId())); - BaseEntity state = new BaseEntity(type, compound); - fc.createEntity(clipboard, positionTag.asDouble(0), positionTag.asDouble(1), positionTag.asDouble(2), (float) directionTag.asDouble(0), (float) directionTag.asDouble(1), state); - } else { - Fawe.debug("Invalid entity: " + id); - } + streamer.addReader("Schematic.Entities.#", (BiConsumer) (index, compound) -> { + if (fc == null) { + setupClipboard(0, uuid); + } + String id = compound.getString("id"); + if (id.isEmpty()) { + return; + } + ListTag positionTag = compound.getListTag("Pos"); + ListTag directionTag = compound.getListTag("Rotation"); + EntityType type = EntityTypes.parse(id); + if (type != null) { + compound.getValue().put("Id", new StringTag(type.getId())); + BaseEntity state = new BaseEntity(type, compound); + fc.createEntity(clipboard, positionTag.asDouble(0), positionTag.asDouble(1), positionTag.asDouble(2), (float) directionTag.asDouble(0), (float) directionTag.asDouble(1), state); + } else { + Fawe.debug("Invalid entity: " + id); } }); streamer.readFully(); @@ -235,6 +216,7 @@ public class SpongeSchematicReader extends NBTSchematicReader { } } } + } if (biomesOut.getSize() != 0) { try (FaweInputStream fis = new FaweInputStream(new LZ4BlockInputStream(new FastByteArraysInputStream(biomesOut.toByteArrays())))) { @@ -249,7 +231,6 @@ public class SpongeSchematicReader extends NBTSchematicReader { return clipboard; } - @Override public void close() throws IOException { inputStream.close(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/legacycompat/NBTCompatibilityHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/legacycompat/NBTCompatibilityHandler.java index ede6aaaac..88c344566 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/legacycompat/NBTCompatibilityHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/legacycompat/NBTCompatibilityHandler.java @@ -20,7 +20,6 @@ package com.sk89q.worldedit.extent.clipboard.io.legacycompat; import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/legacycompat/SignCompatibilityHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/legacycompat/SignCompatibilityHandler.java index 791b46495..ad75ed911 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/legacycompat/SignCompatibilityHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/legacycompat/SignCompatibilityHandler.java @@ -26,8 +26,6 @@ import com.google.gson.JsonPrimitive; import com.google.gson.JsonSyntaxException; import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.world.block.BlockID; -import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockTypes; @@ -37,13 +35,7 @@ public class SignCompatibilityHandler implements NBTCompatibilityHandler { @Override public > boolean isAffectedBlock(B block) { - switch (block.getBlockType().getInternalId()) { - case BlockID.SIGN: - case BlockID.WALL_SIGN: - return true; - default: - return false; - } + return block.getBlockType() == BlockTypes.SIGN || block.getBlockType() == BlockTypes.WALL_SIGN; } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java index fb7d038e4..34f7f668d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.extent.inventory; -import com.boydti.fawe.object.exception.FaweException; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; @@ -27,23 +26,18 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; -import com.sk89q.worldedit.world.block.BlockTypes; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import static com.google.common.base.Preconditions.checkNotNull; +import javax.annotation.Nullable; /** * Applies a {@link BlockBag} to operations. */ public class BlockBagExtent extends AbstractDelegateExtent { - private final boolean mine; - private int[] missingBlocks = new int[BlockTypes.size()]; + private Map missingBlocks = new HashMap<>(); private BlockBag blockBag; /** @@ -52,15 +46,9 @@ public class BlockBagExtent extends AbstractDelegateExtent { * @param extent the extent * @param blockBag the block bag */ - public BlockBagExtent(Extent extent, @Nonnull BlockBag blockBag) { - this(extent, blockBag, false); - } - - public BlockBagExtent(Extent extent, @Nonnull BlockBag blockBag, boolean mine) { + public BlockBagExtent(Extent extent, @Nullable BlockBag blockBag) { super(extent); - checkNotNull(blockBag); this.blockBag = blockBag; - this.mine = mine; } /** @@ -88,15 +76,9 @@ public class BlockBagExtent extends AbstractDelegateExtent { * @return a map of missing blocks */ public Map popMissing() { - HashMap map = new HashMap<>(); - for (int i = 0; i < missingBlocks.length; i++) { - int count = missingBlocks[i]; - if (count > 0) { - map.put(BlockTypes.get(i), count); - } - } - Arrays.fill(missingBlocks, 0); - return map; + Map missingBlocks = this.missingBlocks; + this.missingBlocks = new HashMap<>(); + return missingBlocks; } @Override @@ -114,19 +96,21 @@ public class BlockBagExtent extends AbstractDelegateExtent { try { blockBag.fetchPlacedBlock(block.toImmutableState()); } catch (UnplaceableBlockException e) { - throw new FaweException.FaweBlockBagException(); + return false; } catch (BlockBagException e) { - missingBlocks[block.getBlockType().getInternalId()]++; - throw new FaweException.FaweBlockBagException(); + if (!missingBlocks.containsKey(block.getBlockType())) { + missingBlocks.put(block.getBlockType(), 1); + } else { + missingBlocks.put(block.getBlockType(), missingBlocks.get(block.getBlockType()) + 1); + } + return false; } } - if (mine) { - if (!existing.getBlockType().getMaterial().isAir()) { - try { - blockBag.storeDroppedBlock(existing); - } catch (BlockBagException ignored) { - } + if (!existing.getBlockType().getMaterial().isAir()) { + try { + blockBag.storeDroppedBlock(existing); + } catch (BlockBagException ignored) { } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/reorder/MultiStageReorder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/reorder/MultiStageReorder.java index 1d4fe4d8d..3e1a7d4fa 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/reorder/MultiStageReorder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/reorder/MultiStageReorder.java @@ -252,4 +252,4 @@ public class MultiStageReorder extends AbstractDelegateExtent implements Reorder return new OperationQueue(operations); } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java index 0958c1341..626f050af 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java @@ -54,6 +54,10 @@ import java.util.Map; import static com.google.common.base.Preconditions.checkNotNull; import static com.sk89q.worldedit.util.Direction.*; +/** + * Transforms blocks themselves (but not their position) according to a + * given transform. + */ public class BlockTransformExtent extends ResettableExtent { private Transform transform; private Transform transformInverse; @@ -407,6 +411,11 @@ public class BlockTransformExtent extends ResettableExtent { return super.setExtent(extent); } + /** + * Get the transform. + * + * @return the transform + */ public Transform getTransform() { return transform; } @@ -496,6 +505,36 @@ public class BlockTransformExtent extends ResettableExtent { return super.setBlock(x, y, z, transformInverse(block)); } + /** + * Get the new value with the transformed direction. + * + * @param allowedStates the allowed states + * @param transform the transform + * @param oldDirection the old direction to transform + * @return a new state or null if none could be found + */ + @Nullable + private static Vector3 getNewStateValue(List allowedStates, Transform transform, Vector3 oldDirection) { + Vector3 newDirection = transform.apply(oldDirection).subtract(transform.apply(Vector3.ZERO)).normalize(); + Vector3 newValue = null; + double closest = -2; + boolean found = false; + + for (Direction v : allowedStates) { + double dot = v.toVector().normalize().dot(newDirection); + if (dot >= closest) { + closest = dot; + newValue = v.toVector(); + found = true; + } + } + + if (found) { + return newValue; + } else { + return null; + } + } @Override public boolean setBlock(BlockVector3 location, BlockStateHolder block) throws WorldEditException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java index d935716c2..8108353e4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java @@ -28,8 +28,6 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BlockStateHolder; -import static com.google.common.base.Preconditions.checkNotNull; - /** * Makes changes to the world as if a player had done so during survival mode. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java index eec8a1ed3..e8ae233dd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java @@ -38,7 +38,7 @@ public class BlockReplace implements RegionFunction { /** * Create a new instance. * - * @param extent an extent + * @param extent an extent * @param pattern a pattern */ public BlockReplace(Extent extent, Pattern pattern) { @@ -55,4 +55,4 @@ public class BlockReplace implements RegionFunction { -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java index 8fb81e669..1e5c62873 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java @@ -19,13 +19,9 @@ package com.sk89q.worldedit.function.block; -import com.boydti.fawe.util.ReflectionUtils; -import com.sk89q.jnbt.ByteTag; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.WorldEditException; +import static com.google.common.base.Preconditions.checkNotNull; -import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.CompoundTagBuilder; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -36,8 +32,6 @@ import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Direction.Flag; - -import static com.google.common.base.Preconditions.checkNotNull; import com.sk89q.worldedit.world.block.BaseBlock; /** @@ -54,11 +48,11 @@ public class ExtentBlockCopy implements RegionFunction { /** * Make a new copy. * - * @param source the source extent - * @param from the source offset + * @param source the source extent + * @param from the source offset * @param destination the destination extent - * @param to the destination offset - * @param transform a transform to apply to positions (after source offset, before destination offset) + * @param to the destination offset + * @param transform a transform to apply to positions (after source offset, before destination offset) */ public ExtentBlockCopy(Extent source, BlockVector3 from, Extent destination, BlockVector3 to, Transform transform) { checkNotNull(source); @@ -75,11 +69,13 @@ public class ExtentBlockCopy implements RegionFunction { @Override public boolean apply(BlockVector3 position) throws WorldEditException { + BaseBlock block = source.getFullBlock(position); BlockVector3 orig = position.subtract(from); BlockVector3 transformed = transform.apply(orig.toVector3()).toBlockPoint(); // Apply transformations to NBT data if necessary - BaseBlock block = transformNbtData(source.getFullBlock(position)); + block = transformNbtData(block); + return destination.setBlock(transformed.add(to), block); } @@ -118,6 +114,4 @@ public class ExtentBlockCopy implements RegionFunction { return state; } - - } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/Naturalizer.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/Naturalizer.java index 30f55258a..f2dff8ae2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/Naturalizer.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/Naturalizer.java @@ -76,15 +76,15 @@ public class Naturalizer implements LayerFunction { affected++; switch (depth) { case 0: - editSession.setBlock(position, BlockTypes.GRASS_BLOCK); + editSession.setBlock(position, BlockTypes.GRASS_BLOCK.getDefaultState()); break; case 1: case 2: case 3: - editSession.setBlock(position, BlockTypes.DIRT); + editSession.setBlock(position, BlockTypes.DIRT.getDefaultState()); break; default: - editSession.setBlock(position, BlockTypes.STONE); + editSession.setBlock(position, BlockTypes.STONE.getDefaultState()); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java index 643f4593e..bbe8c96cc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java @@ -61,10 +61,10 @@ public class ExtentEntityCopy implements EntityFunction { /** * Create a new instance. * - * @param from the from position + * @param from the from position * @param destination the destination {@code Extent} - * @param to the destination position - * @param transform the transformation to apply to both position and orientation + * @param to the destination position + * @param transform the transformation to apply to both position and orientation */ public ExtentEntityCopy(Vector3 from, Extent destination, Vector3 to, Transform transform) { checkNotNull(from); @@ -111,6 +111,7 @@ public class ExtentEntityCopy implements EntityFunction { : transform.apply(location.getDirection()).subtract(transform.apply(Vector3.ZERO)).normalize(); newLocation = new Location(destination, newPosition.add(to.round().add(0.5, 0.5, 0.5)), newDirection); + // Some entities store their position data in NBT state = transformNbtData(state); boolean success = destination.createEntity(newLocation, state) != null; @@ -135,6 +136,7 @@ public class ExtentEntityCopy implements EntityFunction { */ private BaseEntity transformNbtData(BaseEntity state) { CompoundTag tag = state.getNbtData(); + if (tag != null) { boolean changed = false; // Handle hanging entities (paintings, item frames, etc.) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java index ef97efcae..602c07f56 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java @@ -84,9 +84,9 @@ public class FloraGenerator implements RegionFunction { */ public static Pattern getDesertPattern() { RandomPattern pattern = new RandomPattern(); - pattern.add((BlockTypes.DEAD_BUSH.getDefaultState()), 30); - pattern.add((BlockTypes.CACTUS.getDefaultState()), 20); - pattern.add((BlockTypes.AIR.getDefaultState()), 300); + pattern.add(new BlockPattern(BlockTypes.DEAD_BUSH.getDefaultState()), 30); + pattern.add(new BlockPattern(BlockTypes.CACTUS.getDefaultState()), 20); + pattern.add(new BlockPattern(BlockTypes.AIR.getDefaultState()), 300); return pattern; } @@ -97,9 +97,9 @@ public class FloraGenerator implements RegionFunction { */ public static Pattern getTemperatePattern() { RandomPattern pattern = new RandomPattern(); - pattern.add((BlockTypes.GRASS.getDefaultState()), 300); - pattern.add((BlockTypes.POPPY.getDefaultState()), 5); - pattern.add((BlockTypes.DANDELION.getDefaultState()), 5); + pattern.add(new BlockPattern(BlockTypes.GRASS.getDefaultState()), 300); + pattern.add(new BlockPattern(BlockTypes.POPPY.getDefaultState()), 5); + pattern.add(new BlockPattern(BlockTypes.DANDELION.getDefaultState()), 5); return pattern; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/ForestGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/ForestGenerator.java index ea2c71a96..9b44d7e43 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/ForestGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/ForestGenerator.java @@ -53,26 +53,23 @@ public class ForestGenerator implements RegionFunction { public boolean apply(BlockVector3 position) throws WorldEditException { BlockState block = editSession.getBlock(position); BlockType t = block.getBlockType(); - switch (t.getInternalId()) { - case BlockID.GRASS_BLOCK: - case BlockID.DIRT: - treeType.generate(editSession, position.add(0, 1, 0)); - return true; - case BlockID.TALL_GRASS: // TODO: This list needs to be moved - case BlockID.DEAD_BUSH: - case BlockID.POPPY: - case BlockID.DANDELION: - editSession.setBlock(position, BlockTypes.AIR.getDefaultState()); - // and then trick the generator here by directly setting into the world - editSession.getWorld().setBlock(position, BlockTypes.AIR.getDefaultState()); - // so that now the generator can generate the tree - boolean success = treeType.generate(editSession, position); - if (!success) { - editSession.setBlock(position, block); // restore on failure - } - return success; - default: // Trees won't grow on this! - return false; + + if (t == BlockTypes.GRASS_BLOCK || t == BlockTypes.DIRT) { + return treeType.generate(editSession, position.add(0, 1, 0)); + } else if (t.getMaterial().isReplacedDuringPlacement()) { + // since the implementation's tree generators generally don't generate in non-air spots, + // we trick editsession history here in the first call + editSession.setBlock(position, BlockTypes.AIR.getDefaultState()); + // and then trick the generator here by directly setting into the world + editSession.getWorld().setBlock(position, BlockTypes.AIR.getDefaultState()); + // so that now the generator can generate the tree + boolean success = treeType.generate(editSession, position); + if (!success) { + editSession.setBlock(position, block); // restore on failure + } + return success; + } else { // Trees won't grow on this! + return false; } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java index da52bb416..0d31760af 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java @@ -104,7 +104,7 @@ public class GardenPatchGenerator implements RegionFunction { int h = random.nextInt(3) - 1; BlockVector3 p; - BlockStateHolder log = BlockTypes.OAK_LOG.getDefaultState(); + BlockState log = BlockTypes.OAK_LOG.getDefaultState(); switch (t) { case 0: @@ -167,7 +167,7 @@ public class GardenPatchGenerator implements RegionFunction { return false; } - BlockStateHolder leavesBlock = BlockTypes.OAK_LEAVES.getDefaultState(); + BlockState leavesBlock = BlockTypes.OAK_LEAVES.getDefaultState(); if (editSession.getBlock(position).getBlockType().getMaterial().isAir()) { editSession.setBlock(position, leavesBlock); @@ -187,7 +187,7 @@ public class GardenPatchGenerator implements RegionFunction { * @return a pumpkin pattern */ public static Pattern getPumpkinPattern() { - return BlockTypes.PUMPKIN.getDefaultState(); + return new BlockPattern(BlockTypes.PUMPKIN.getDefaultState()); } /** @@ -208,6 +208,6 @@ public class GardenPatchGenerator implements RegionFunction { * @return a melon pattern */ public static Pattern getMelonPattern() { - return (BlockTypes.MELON.getDefaultState()); + return new BlockPattern(BlockTypes.MELON.getDefaultState()); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java index 1e5a2e8e3..e7f919474 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java @@ -1,31 +1,45 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + package com.sk89q.worldedit.function.mask; import com.boydti.fawe.object.collection.FastBitSet; -import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.StringMan; -import com.sk89q.worldedit.extent.NullExtent; -import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.extent.NullExtent; +import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.AbstractProperty; import com.sk89q.worldedit.registry.state.Property; -import static com.google.common.base.Preconditions.checkNotNull; - -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.block.BlockStateHolder; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import static com.google.common.base.Preconditions.checkNotNull; + /** * A mask that checks whether blocks at the given positions are matched by * a block in a list. @@ -38,17 +52,23 @@ public class BlockMask extends AbstractExtentMask { private final long[][] bitSets; protected final static long[] ALL = new long[0]; + /** + * Create a new block mask. + * + * @param extent the extent + * @param blocks a list of blocks to match + */ @Deprecated public BlockMask(Extent extent, Collection blocks) { super(extent); - MainUtil.warnDeprecated(BlockMaskBuilder.class); + checkNotNull(blocks); this.bitSets = new BlockMaskBuilder().addBlocks(blocks).optimize().getBits(); } @Deprecated public BlockMask(Extent extent, BaseBlock... blocks) { super(extent); - MainUtil.warnDeprecated(BlockMaskBuilder.class); + checkNotNull(blocks); this.bitSets = new BlockMaskBuilder().addBlocks(blocks).optimize().getBits(); } @@ -57,6 +77,12 @@ public class BlockMask extends AbstractExtentMask { this.bitSets = new long[BlockTypes.size()][]; } + /** + * Create a new block mask. + * + * @param extent the extent + * @param bitSets an array of blocks to match + */ protected BlockMask(Extent extent, long[][] bitSets) { super(extent); this.bitSets = bitSets; @@ -117,6 +143,7 @@ public class BlockMask extends AbstractExtentMask { if (states.get(null) == 1) return new SingleBlockTypeMask(getExtent(), BlockTypes.get(indexNull)).inverse(); + boolean[] types = new boolean[BlockTypes.size()]; for (int i = 0; i < bitSets.length; i++) { if (bitSets[i].length == 0) types[i] = true; @@ -233,7 +260,7 @@ public class BlockMask extends AbstractExtentMask { @Override public boolean test(BlockVector3 vector) { - BlockStateHolder block = getExtent().getBlock(vector); + BlockState block = getExtent().getBlock(vector); long[] bitSet = bitSets[block.getInternalBlockTypeId()]; if (bitSet == null) return false; if (bitSet.length == 0) return true; @@ -246,5 +273,4 @@ public class BlockMask extends AbstractExtentMask { return null; } - -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java index 844f319a7..f08be8f63 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java @@ -19,12 +19,19 @@ package com.sk89q.worldedit.function.mask; -import com.google.common.base.Function; - import com.sk89q.worldedit.math.BlockVector3; import javax.annotation.Nullable; -import java.util.*; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; import static com.google.common.base.Preconditions.checkNotNull; @@ -113,7 +120,7 @@ public class MaskIntersection extends AbstractMask { outer: for (Mask mask : masks) { for (Mask other : masks) { - AbstractMap.SimpleEntry pair = new AbstractMap.SimpleEntry(mask, other); + AbstractMap.SimpleEntry pair = new AbstractMap.SimpleEntry<>(mask, other); if (failedCombines.contains(pair)) continue; Mask combined = pairing.apply(pair); if (combined != null) { @@ -177,6 +184,7 @@ public class MaskIntersection extends AbstractMask { return false; } } + return true; } @@ -194,4 +202,5 @@ public class MaskIntersection extends AbstractMask { } return new MaskIntersection2D(mask2dList); } + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java index a3ac57a03..dbeb2bc87 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java @@ -19,14 +19,14 @@ package com.sk89q.worldedit.function.mask; -import com.google.common.base.Function; import com.sk89q.worldedit.math.BlockVector3; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; -import javax.annotation.Nullable; +import java.util.function.Function; /** * Combines several masks and requires that one or more masks return true diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/AffineTransform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/AffineTransform.java index d51436598..09986950a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/AffineTransform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/AffineTransform.java @@ -1,17 +1,35 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + package com.sk89q.worldedit.math.transform; -import java.io.IOException; -import java.io.Serializable; - -import com.sk89q.worldedit.math.MutableBlockVector3; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MathUtils; import com.sk89q.worldedit.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; +import java.io.IOException; +import java.io.Serializable; + /** * An affine transform. - *

+ * *

This class is from the * JavaGeom project, * which is licensed under LGPL v2.1.

@@ -153,7 +171,7 @@ public class AffineTransform implements Transform, Serializable { * * @return the determinant of the transform. */ - public double determinant() { + private double determinant() { return m00 * (m11 * m22 - m12 * m21) - m01 * (m10 * m22 - m20 * m12) + m02 * (m10 * m21 - m20 * m11); } @@ -302,13 +320,10 @@ public class AffineTransform implements Transform, Serializable { @Override public Vector3 apply(Vector3 vector) { - double x = (vector.getX() * m00 + vector.getY() * m01 + vector.getZ() * m02 + m03); - double y = (vector.getX() * m10 + vector.getY() * m11 + vector.getZ() * m12 + m13); - double z = (vector.getX() * m20 + vector.getY() * m21 + vector.getZ() * m22 + m23); - vector = vector.mutX(x); - vector = vector.mutY(y); - vector = vector.mutZ(z); - return vector; + return MutableVector3.at( + vector.getX() * m00 + vector.getY() * m01 + vector.getZ() * m02 + m03, + vector.getX() * m10 + vector.getY() * m11 + vector.getZ() * m12 + m13, + vector.getX() * m20 + vector.getY() * m21 + vector.getZ() * m22 + m23); } public AffineTransform combine(AffineTransform other) { @@ -319,7 +334,8 @@ public class AffineTransform implements Transform, Serializable { public Transform combine(Transform other) { if (other instanceof Identity || other.isIdentity()) { return this; - } else if (other instanceof AffineTransform) { + } + if (other instanceof AffineTransform) { return concatenate((AffineTransform) other); } else { return new CombinedTransform(this, other); @@ -336,4 +352,4 @@ public class AffineTransform implements Transform, Serializable { } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/CraftScriptContext.java b/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/CraftScriptContext.java index e97e7ebf6..b95d800a7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/CraftScriptContext.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/CraftScriptContext.java @@ -19,10 +19,13 @@ package com.sk89q.worldedit.scripting; -import com.sk89q.worldedit.*; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.DisallowedItemException; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.LocalConfiguration; +import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.UnknownItemException; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.command.InsufficientArgumentsException; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.input.ParserContext; @@ -56,7 +59,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Get an edit session. Every subsequent call returns a new edit session. * Usually you only need to use one edit session. - * + * * @return an edit session */ public EditSession remember() { @@ -71,7 +74,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Get the player. - * + * * @return the calling player */ public Player getPlayer() { @@ -80,7 +83,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Get the player's session. - * + * * @return a session */ public LocalSession getSession() { @@ -89,7 +92,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Get the configuration for WorldEdit. - * + * * @return the configuration */ public LocalConfiguration getConfiguration() { @@ -98,7 +101,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Get a list of edit sessions that have been created. - * + * * @return a list of created {@code EditSession}s */ public List getEditSessions() { @@ -107,7 +110,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Print a regular message to the user. - * + * * @param message a message */ public void print(String message) { @@ -116,7 +119,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Print an error message to the user. - * + * * @param message a message */ public void error(String message) { @@ -125,7 +128,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Print an raw message to the user. - * + * * @param message a message */ public void printRaw(String message) { @@ -184,8 +187,8 @@ public class CraftScriptContext extends CraftScriptEnvironment { * * @param list the input * @return pattern - * @throws UnknownItemException - * @throws DisallowedItemException + * @throws UnknownItemException + * @throws DisallowedItemException */ public Pattern getBlockPattern(String list) throws WorldEditException { ParserContext context = new ParserContext(); @@ -201,8 +204,8 @@ public class CraftScriptContext extends CraftScriptEnvironment { * @param list a list * @param allBlocksAllowed true if all blocks are allowed * @return set - * @throws UnknownItemException - * @throws DisallowedItemException + * @throws UnknownItemException + * @throws DisallowedItemException */ public Set getBlocks(String list, boolean allBlocksAllowed) throws WorldEditException { ParserContext context = new ParserContext(); @@ -219,15 +222,15 @@ public class CraftScriptContext extends CraftScriptEnvironment { * directory traversal exploits by checking the root directory and the file * directory. On success, a {@code java.io.File} object will be * returned. - * + * *

Use this method if you need to read a file from a directory.

- * + * * @param folder sub-directory to look in * @param filename filename (user-submitted) * @param defaultExt default extension to append if there is none * @param exts list of extensions for file open dialog, null for no filter * @return a file - * @throws FilenameException + * @throws FilenameException */ public File getSafeOpenFile(String folder, String filename, String defaultExt, String... exts) throws FilenameException { File dir = controller.getWorkingDirectoryFile(folder); @@ -240,15 +243,15 @@ public class CraftScriptContext extends CraftScriptEnvironment { * directory traversal exploits by checking the root directory and the file * directory. On success, a {@code java.io.File} object will be * returned. - * + * *

Use this method if you need to read a file from a directory.

- * + * * @param folder sub-directory to look in * @param filename filename (user-submitted) * @param defaultExt default extension to append if there is none * @param exts list of extensions for file save dialog, null for no filter * @return a file - * @throws FilenameException + * @throws FilenameException */ public File getSafeSaveFile(String folder, String filename, String defaultExt, String... exts) throws FilenameException { File dir = controller.getWorkingDirectoryFile(folder); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/java/RhinoScriptEngine.java b/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/java/RhinoScriptEngine.java index bf64e4e12..afab20c3a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/java/RhinoScriptEngine.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/java/RhinoScriptEngine.java @@ -19,6 +19,14 @@ package com.sk89q.worldedit.scripting.java; +import com.sk89q.worldedit.scripting.RhinoContextFactory; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.ImporterTopLevel; +import org.mozilla.javascript.JavaScriptException; +import org.mozilla.javascript.RhinoException; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.ScriptableObject; + import java.io.IOException; import java.io.Reader; @@ -30,14 +38,6 @@ import javax.script.ScriptEngineFactory; import javax.script.ScriptException; import javax.script.SimpleBindings; -import org.mozilla.javascript.Context; -import org.mozilla.javascript.ImporterTopLevel; -import org.mozilla.javascript.JavaScriptException; -import org.mozilla.javascript.RhinoException; -import org.mozilla.javascript.Scriptable; -import org.mozilla.javascript.ScriptableObject; -import com.sk89q.worldedit.scripting.RhinoContextFactory; - public class RhinoScriptEngine extends AbstractScriptEngine { private ScriptEngineFactory factory; private Context cx; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/command/parametric/BindingMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/command/parametric/BindingMap.java index de1896397..7500d5afa 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/command/parametric/BindingMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/command/parametric/BindingMap.java @@ -1,7 +1,5 @@ package com.sk89q.worldedit.util.command.parametric; -import com.boydti.fawe.util.ArrayUtil; -import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.StringMan; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandException; @@ -10,13 +8,6 @@ import com.sk89q.worldedit.util.command.CommandMapping; import com.sk89q.worldedit.util.command.MissingParameterException; import com.sk89q.worldedit.util.command.SimpleDispatcher; import com.sk89q.worldedit.util.command.binding.Range; -import com.sk89q.worldedit.util.command.parametric.ArgumentStack; -import com.sk89q.worldedit.util.command.parametric.Binding; -import com.sk89q.worldedit.util.command.parametric.BindingBehavior; -import com.sk89q.worldedit.util.command.parametric.BindingMatch; -import com.sk89q.worldedit.util.command.parametric.ParameterData; -import com.sk89q.worldedit.util.command.parametric.ParameterException; -import com.sk89q.worldedit.util.command.parametric.ParametricBuilder; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java index cc5b4be68..1bd6f8cf0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java @@ -154,4 +154,5 @@ public abstract class AbstractWorld implements World { return Double.compare(priority, other != null ? other.priority : 0); } } -} \ No newline at end of file + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java index fa27b3d17..0cfbdcd13 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.world; -import com.sk89q.worldedit.*; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; @@ -35,7 +34,6 @@ import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.TreeGenerator.TreeType; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeTypes; -import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockTypes; @@ -54,7 +52,7 @@ public class NullWorld extends AbstractWorld { private static final NullWorld INSTANCE = new NullWorld(); - public NullWorld() { + protected NullWorld() { } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java index aeecbcd09..425a97b81 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java @@ -830,16 +830,15 @@ public final class BlockTypes { } } - { // Register new blocks - int internalId = 1; - for (Map.Entry entry : blockMap.entrySet()) { - String id = entry.getKey(); - String defaultState = entry.getValue(); - // Skip already registered ids - for (; values[internalId] != null; internalId++); - BlockType type = register(defaultState, internalId, stateList); - values[internalId] = type; - } + // Register new blocks + int internalId = 1; + for (Map.Entry entry : blockMap.entrySet()) { + String id = entry.getKey(); + String defaultState = entry.getValue(); + // Skip already registered ids + for (; values[internalId] != null; internalId++); + BlockType type = register(defaultState, internalId, stateList); + values[internalId] = type; } // Add to $Registry @@ -866,9 +865,7 @@ public final class BlockTypes { try { Field field = BlockTypes.class.getDeclaredField(enumName); ReflectionUtils.setFailsafeFieldValue(field, null, existing); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { + } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } @@ -898,12 +895,12 @@ public final class BlockTypes { try { BlockStateHolder block = LegacyMapper.getInstance().getBlockFromLegacy(input); if (block != null) return block.getBlockType(); - } catch (NumberFormatException | IndexOutOfBoundsException e) { + } catch (NumberFormatException | IndexOutOfBoundsException ignored) { } throw new SuggestInputParseException("Does not match a valid block type: " + inputLower, inputLower, () -> Stream.of(BlockTypes.values) .filter(b -> StringMan.blockStateMatches(inputLower, b.getId())) - .map(e1 -> e1.getId()) + .map(BlockType::getId) .sorted(StringMan.blockStateComparator(inputLower)) .collect(Collectors.toList()) ); @@ -913,31 +910,31 @@ public final class BlockTypes { return $NAMESPACES; } - public static final @Nullable BlockType get(final String id) { + public static @Nullable BlockType get(final String id) { return $REGISTRY.get(id); } - public static final @Nullable BlockType get(final CharSequence id) { + public static @Nullable BlockType get(final CharSequence id) { return $REGISTRY.get(id); } @Deprecated - public static final BlockType get(final int ordinal) { + public static BlockType get(final int ordinal) { return values[ordinal]; } @Deprecated - public static final BlockType getFromStateId(final int internalStateId) { + public static BlockType getFromStateId(final int internalStateId) { return values[internalStateId & BIT_MASK]; } @Deprecated - public static final BlockType getFromStateOrdinal(final int internalStateOrdinal) { + public static BlockType getFromStateOrdinal(final int internalStateOrdinal) { return states[internalStateOrdinal].getBlockType(); } public static int size() { return values.length; } - + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java index 58f7cb8e9..16880af4a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java @@ -28,10 +28,9 @@ import com.google.common.io.Resources; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; -import com.sk89q.worldedit.registry.state.PropertyKey; -import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.registry.state.PropertyKey; import com.sk89q.worldedit.util.gson.VectorAdapter; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -48,11 +47,8 @@ import javax.annotation.Nullable; import java.io.IOException; import java.net.URL; import java.nio.charset.Charset; -import java.util.Arrays; import java.util.Map; -import static com.google.common.base.Preconditions.checkNotNull; - public class LegacyMapper { private static final Logger log = LoggerFactory.getLogger(LegacyMapper.class); @@ -226,7 +222,7 @@ public class LegacyMapper { Integer combinedId = getLegacyCombined(blockState); return combinedId == null ? null : new int[] { combinedId >> 4, combinedId & 0xF }; } - + public BaseBlock getBaseBlockFromPlotBlock(PlotBlock plotBlock) { if(plotBlock instanceof StringPlotBlock) { try {