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 8556027f4..7f97d3a52 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,13 +15,12 @@ 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(@NotNull final Player parent) { + public BukkitPlayer(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 889f85897..e020b3f71 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(WorldEditPlugin plugin) { + public FaweBukkit(Plugin 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 e49c68a45..1ccdcb03f 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 da10b2073..4a53e22e2 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,6 +6,7 @@ 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; @@ -190,8 +191,8 @@ public class MCAChunk extends FaweChunk { setNibble(endIndex, thisSkyLight, (byte) 0); setNibble(endIndex, thisBlockLight, (byte) 0); } - Arrays.fill(thisBlockLight, startIndexShift, endIndex + 1, (byte) 0); - Arrays.fill(thisBlockLight, startIndexShift, endIndexShift + 1, (byte) 0); + ArrayUtil.fill(thisSkyLight, startIndexShift, endIndexShift + 1, (byte) 0); + ArrayUtil.fill(thisBlockLight, startIndexShift, endIndexShift + 1, (byte) 0); } } continue; @@ -291,8 +292,8 @@ public class MCAChunk extends FaweChunk { if (otherIds == null) { if (currentIds != null) { Arrays.fill(currentIds, indexStart, indexEnd, 0); - Arrays.fill(skyLight[thisLayer], indexStartShift, indexEndShift, (byte) 0); - Arrays.fill(blockLight[thisLayer], indexStartShift, indexEndShift, (byte) 0); + ArrayUtil.fill(skyLight[thisLayer], indexStartShift, indexEndShift, (byte) 0); + ArrayUtil.fill(blockLight[thisLayer], indexStartShift, indexEndShift, (byte) 0); } } else { if (currentIds == null) { @@ -319,8 +320,8 @@ public class MCAChunk extends FaweChunk { continue; } Arrays.fill(thisIds, thisStartIndex, thisStartIndex + 256, 0); - Arrays.fill(this.skyLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0); - Arrays.fill(this.blockLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0); + ArrayUtil.fill(this.skyLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0); + ArrayUtil.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 2d3b75c08..b274b241c 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,9 +56,24 @@ public class MCAFile { private final int X, Z; private final Int2ObjectOpenHashMap chunks = new Int2ObjectOpenHashMap<>(); - final ThreadLocal byteStore1 = ThreadLocal.withInitial(() -> new byte[4096]); - final ThreadLocal byteStore2 = ThreadLocal.withInitial(() -> new byte[4096]); - final ThreadLocal byteStore3 = ThreadLocal.withInitial(() -> new byte[1024]); + 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]; + } + }; public MCAFile(FaweQueue parent, File file) { this.queue = parent; @@ -189,10 +204,9 @@ public class MCAFile { if (offset == 0) { return null; } - MCAChunk chunk; - try (NBTInputStream nis = getChunkIS(offset)) { - chunk = new MCAChunk(nis, queue, cx, cz, false); - } + NBTInputStream nis = getChunkIS(offset); + MCAChunk chunk = new MCAChunk(nis, queue, cx, cz, false); + nis.close(); int pair = MathMan.pair((short) (cx & 31), (short) (cz & 31)); synchronized (chunks) { chunks.put(pair, chunk); @@ -333,6 +347,7 @@ 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()); @@ -377,7 +392,8 @@ public class MCAFile { return null; } byte[] uncompressed = chunk.toBytes(byteStore3.get()); - return MainUtil.compress(uncompressed, byteStore2.get(), null); + byte[] compressed = MainUtil.compress(uncompressed, byteStore2.get(), null); + return compressed; } private byte[] getChunkBytes(int cx, int cz) throws Exception { @@ -493,21 +509,24 @@ public class MCAFile { modified = true; chunk.setLastUpdate(now); if (!chunk.isDeleted()) { - 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; + 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(); } - 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 020cee278..53255a02b 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,6 +1,7 @@ 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; @@ -17,7 +18,6 @@ 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,6 +25,11 @@ 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; @@ -34,7 +39,12 @@ public class MCAQueue extends NMSMappedFaweQueue blockStore = ThreadLocal.withInitial(MutableMCABackedBaseBlock::new); + private final ThreadLocal blockStore = new ThreadLocal() { + @Override + protected MutableMCABackedBaseBlock initialValue() { + return new MutableMCABackedBaseBlock(); + } + }; @Override protected void finalize() throws Throwable { @@ -114,7 +124,7 @@ public class MCAQueue extends NMSMappedFaweQueue chunk; + FaweChunk chunk; synchronized (this) { chunk = this.getFaweChunk(otherCX, otherCZ); } @@ -192,7 +202,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"); @@ -241,7 +251,7 @@ public class MCAQueue extends NMSMappedFaweQueue chunk = from.getFaweChunk(otherCX, otherCZ); + FaweChunk chunk = from.getFaweChunk(otherCX, otherCZ); if (!(chunk instanceof NullFaweChunk)) { MCAChunk other = (MCAChunk) chunk; int ocbx = otherCX << 4; @@ -437,7 +447,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 @@ -504,46 +514,49 @@ public class MCAQueue extends NMSMappedFaweQueue() { @Override public void run(final Integer rcx, final Integer rcz, Integer offset, Integer size) { - 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); + 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); + } } } } } + filter.finishChunk(chunk, value); } - filter.finishChunk(chunk, value); + } catch (Throwable e) { + e.printStackTrace(); } - } catch (Throwable e) { - e.printStackTrace(); } + } catch (Throwable e) { + e.printStackTrace(); } - } catch (Throwable e) { - e.printStackTrace(); } }); } @@ -555,8 +568,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 5e0acac44..164377551 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,6 +3,7 @@ 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 f7f41de30..1414df181 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 9d88d540d..a967f090d 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 d44c31b0a..ffd05cc19 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 91eee4d4c..7216bbfeb 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 549889eac..790338f41 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 480580590..504af840a 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 7f51eb7c1..1fe150abb 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 6872d2509..6e18b6839 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,6 +143,10 @@ 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); @@ -519,6 +523,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 c319f7921..d4cca8c3d 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,11 +51,14 @@ 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(), () -> { - try { - Files.move(source, dest, StandardCopyOption.ATOMIC_MOVE); - } catch (IOException e1) { - e1.printStackTrace(); + 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(); + } } }, 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 6d639fb35..6e97f7a7c 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,232 +5,229 @@ 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 + if ( k == ( key ) ) //we check FREE and REMOVED prior to this call + return (V) m_data[ ptr + 1 ]; + while ( true ) { - 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 df56e4b16..b3c4d0d5c 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,9 +28,10 @@ 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 < width; j++, index++) { + for (int j = 0; j < colSize; j++, index++) { long val = getVal(i, j, index, source[index]); summed[index] = val; } @@ -93,4 +94,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 475a18a07..95b652ecd 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[0]); + this.extents = getExtents().toArray(new ResettableExtent[getExtents().size()]); } @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 5c849f57c..50a53fdef 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,7 +4,9 @@ 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; @@ -20,13 +22,17 @@ 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 instanceof MappedFaweQueue ? (MappedFaweQueue) faweQueue : null; + this.queue = faweQueue != null && 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 d0635b76b..2bb7aa619 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,7 +124,10 @@ public class PlotTrim { @Override public boolean appliesFile(int mcaX, int mcaZ) { ChunkLoc loc = new ChunkLoc(mcaX, mcaZ); - return !mcas.contains(loc); + if (mcas.contains(loc)) { + return false; + } + return true; } @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 new file mode 100644 index 000000000..f5c2f8056 --- /dev/null +++ b/worldedit-core/src/main/java/com/boydti/fawe/util/ArrayUtil.java @@ -0,0 +1,27 @@ +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 875fc3da1..f15bb7ef0 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,7 +20,6 @@ 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; @@ -30,29 +29,21 @@ 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()); @@ -73,16 +64,12 @@ 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; @@ -109,12 +96,8 @@ 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 b1c2c85bf..0da1cc9cf 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,17 +5,29 @@ 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)); @@ -24,7 +36,6 @@ public class CachedMathMan { /** * Optimized for i elem 0,65536 (characters) - * * @param i * @return square root */ @@ -40,4 +51,37 @@ 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 1c4c959de..a9ae2f2cb 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,8 +1,11 @@ package com.boydti.fawe.util; -import com.sk89q.worldedit.world.block.BlockType; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +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 { @@ -40,7 +43,7 @@ public class CachedTextureUtil extends DelegateTextureUtil { } BiomeColor result = parent.getNearestBiome(color); if (result != null) { - colorBiomeMap.put(color, (Integer) result.id); + colorBiomeMap.put((int) color, (Integer) result.id); } return result; } @@ -53,7 +56,7 @@ public class CachedTextureUtil extends DelegateTextureUtil { } BlockType result = parent.getNearestBlock(color); if (result != null) { - colorBlockMap.put(color, result); + colorBlockMap.put((int) 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 202832975..69de226b7 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,12 +14,8 @@ 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; @@ -48,4 +44,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 a54f63231..635e8247d 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.*; +import java.awt.Color; 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 ignored) { - } + } catch (NumberFormatException nfe) {} 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 ignored) { - } + } catch (NumberFormatException nfe) {} throw new IllegalArgumentException("Invalid color specification"); } @@ -104,8 +104,7 @@ 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; } @@ -117,6 +116,7 @@ public class ColorUtil { int r; int g; int b; + int a; if (len == 3) { r = Integer.parseInt(color.substring(0, 1), 16); @@ -139,8 +139,7 @@ public class ColorUtil { b = Integer.parseInt(color.substring(4, 6), 16); return new Color(r, g, b); } - } catch (NumberFormatException ignored) { - } + } catch (NumberFormatException nfe) {} 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 386bf4b09..5aa095f62 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,7 +1,9 @@ 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; @@ -16,10 +18,6 @@ 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); @@ -125,6 +123,10 @@ 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 d81b165e6..c24a30d8e 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,8 +24,28 @@ 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.*; - +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 java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; @@ -54,9 +74,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"); @@ -159,10 +179,10 @@ public final class DocumentationPrinter { Command cmd = method.getAnnotation(Command.class); String[] aliases = cmd.aliases(); - StringBuilder usage = new StringBuilder(prefix + aliases[0] + " " + cmd.usage()); + String usage = prefix + aliases[0] + " " + cmd.usage(); if (!cmd.flags().isEmpty()) { for (char c : cmd.flags().toCharArray()) { - usage.append(" [-").append(c).append("]"); + usage += " [-" + c + "]"; } } // stream.append("#### [`" + usage + "`](" + "https://github.com/boy0001/FastAsyncWorldedit/wiki/" + aliases[0] + ")\n"); @@ -185,9 +205,7 @@ 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 6cfaf5cfd..a20c8d3d5 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,11 +4,7 @@ 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.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.*; import com.boydti.fawe.object.changeset.DiskStorageHistory; import com.boydti.fawe.object.changeset.FaweChangeSet; import com.boydti.fawe.object.changeset.MemoryOptimizedHistory; @@ -18,10 +14,9 @@ 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; @@ -107,8 +102,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 */ @@ -196,6 +191,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 ab3d0244e..64a0a6e3d 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,7 +2,6 @@ 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 6ae540e38..f52a33e5f 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,17 +3,13 @@ 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() { @@ -36,6 +32,9 @@ public class FaweTimer implements Runnable { lastPoll = tickStart; } + private long lastGetTPSTick = 0; + private double lastGetTPSValue = 20d; + public double getTPS() { if (tick < lastGetTPSTick + tickInterval) { return lastGetTPSValue; @@ -61,6 +60,9 @@ 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 632e3030c..25a711786 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,5 +1,9 @@ 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; @@ -7,9 +11,11 @@ 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; @@ -21,9 +27,7 @@ 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]; @@ -37,4 +41,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 80a43220f..25236077a 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,41 +1,48 @@ package com.boydti.fawe.util; -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.io.*; import java.net.URI; public final class IOUtil { - public static int readInt(InputStream in) throws IOException { + 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 { 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 void writeInt(OutputStream out, int v) throws IOException { + public static final 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 void writeVarInt(final OutputStream out, int i) throws IOException { - while ((i & -128) != 0) { + public static final 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 int readVarInt(InputStream in) throws IOException { + public static final int readVarInt(InputStream in) throws IOException { int i = 0; int offset = 0; int b; @@ -47,7 +54,7 @@ public final class IOUtil { return i; } - public static void copy(InputStream in, OutputStream out) throws IOException { + public static final void copy(InputStream in, OutputStream out) throws IOException { byte[] buf = new byte[8192]; while (true) { int r = in.read(buf); @@ -58,7 +65,7 @@ public final class IOUtil { } } - public static int copy(InputStream in, OutputStream out, int len) throws IOException { + public static final 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)); @@ -71,7 +78,7 @@ public final class IOUtil { return len; } - public static void copy(InputStream in, DataOutput out) throws IOException { + public static final void copy(InputStream in, DataOutput out) throws IOException { byte[] buf = new byte[8192]; while (true) { int r = in.read(buf); @@ -81,5 +88,4 @@ 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 e90dcadf0..83a0a3087 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,12 +1,9 @@ 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.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; +import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; @@ -15,6 +12,21 @@ 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 08ffaeba4..86a415298 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,23 +5,12 @@ import com.google.common.base.Charsets; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -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.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.nio.file.Files; -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; +import java.util.*; /** * Single class paster for the Incendo paste service @@ -39,8 +28,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; @@ -56,85 +45,11 @@ 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 * @@ -157,7 +72,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); @@ -184,7 +99,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"); } @@ -215,7 +130,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()))) { @@ -271,4 +186,78 @@ 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 95b78c54c..41d165e25 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,7 +1,6 @@ package com.boydti.fawe.util; import com.boydti.fawe.Fawe; - import java.io.DataInputStream; import java.io.IOException; import java.net.URL; @@ -12,10 +11,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), ; @@ -24,9 +23,12 @@ 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; @@ -34,9 +36,7 @@ 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 8c3ab78b5..262c4e933 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,35 +3,19 @@ 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.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.*; 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.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.jnbt.*; 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.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 net.jpountz.lz4.*; import javax.annotation.Nullable; import javax.imageio.ImageIO; @@ -39,49 +23,28 @@ import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.lang.reflect.Array; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; +import java.lang.reflect.Method; +import java.net.*; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; import java.nio.charset.StandardCharsets; -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.*; 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.Map; -import java.util.Scanner; -import java.util.UUID; +import java.util.*; +import java.util.Map.Entry; 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.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 java.util.zip.*; 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 @@ -142,6 +105,10 @@ 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() { @@ -170,9 +137,7 @@ 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; } @@ -182,15 +147,11 @@ 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(); @@ -198,13 +159,9 @@ 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 { @@ -225,13 +182,9 @@ 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 (val != null && val > max[0]) { - max[0] = val; + if (i != -1) val = StringMan.toInteger(name, 0, i); } + if (val != null && val > max[0]) max[0] = val; return false; }); return max[0] + 1; @@ -269,6 +222,10 @@ 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); } @@ -287,9 +244,7 @@ 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(); } @@ -307,9 +262,7 @@ 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(); } @@ -491,6 +444,36 @@ 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(); @@ -568,12 +551,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]; @@ -615,9 +598,7 @@ 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); @@ -695,6 +676,60 @@ 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) { @@ -711,12 +746,16 @@ public class MainUtil { String className = creatorElement.getClassName(); Class clazz = Class.forName(className); String creator = clazz.getSimpleName(); + String packageName = clazz.getPackage().getName(); - String myName = Class.forName(stack.getClassName()).getSimpleName(); - Fawe.debug("@" + creator + " used by " + myName + "." + stack.getMethodName() + "():" + stack.getLineNumber() + " is deprecated."); + StackTraceElement deprecatedElement = stack; + String myName = Class.forName(deprecatedElement.getClassName()).getSimpleName(); + Fawe.debug("@" + creator + " used by " + myName + "." + deprecatedElement.getMethodName() + "():" + deprecatedElement.getLineNumber() + " is deprecated."); Fawe.debug(" - Alternatives: " + StringMan.getString(alternatives)); } catch (Throwable throwable) { throwable.printStackTrace(); + } finally { + break; } } } @@ -743,9 +782,7 @@ public class MainUtil { break; case '.': res[index--] = val; - if (index == -1) { - return res; - } + if (index == -1) return res; val = 0; numIndex = 1; break; @@ -768,26 +805,18 @@ 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()); @@ -951,6 +980,10 @@ 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(); @@ -958,9 +991,7 @@ 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(); @@ -971,6 +1002,49 @@ 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; @@ -1014,8 +1088,4 @@ 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 b688ca096..4f524e5e1 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,7 +3,6 @@ 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 578e8cafe..711de5ff8 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,7 +4,6 @@ public class MathMan { /** * Optimized for i elem 0,65536 (characters) - * * @param i * @return square root */ @@ -23,7 +22,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); } @@ -52,6 +51,16 @@ 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) { @@ -62,6 +71,11 @@ 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; } @@ -107,59 +121,72 @@ public class MathMan { } } - public static int pair(short x, short y) { + 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) { return (x << 16) | (y & 0xFFFF); } - public static short unpairX(int hash) { + public static final short unpairX(int hash) { return (short) (hash >> 16); } - public static short unpairY(int hash) { + public static final short unpairY(int hash) { return (short) (hash & 0xFFFF); } - public static short pairByte(int x, int y) { + public static final short pairByte(int x, int y) { return (short) ((x << 8) | (y & 0xFF)); } - public static byte unpairShortX(short pair) { + public static final byte unpairShortX(short pair) { return (byte) (pair >> 8); } - public static byte unpairShortY(short pair) { + public static final byte unpairShortY(short pair) { return (byte) pair; } - public static long pairInt(int x, int y) { + public static final long pairInt(int x, int y) { return (((long) x) << 32) | (y & 0xffffffffL); } - public static long untripleWorldCoordX(long triple) { + 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) { return (((triple >> 8) & 0x3FFFFFF) << 38) >> 38; } - public static long untripleWorldCoordY(long triple) { + public static final long untripleWorldCoordY(long triple) { return triple & 0xFF; } - public static short tripleBlockCoord(int x, int y, int z) { + public static final long untripleWorldCoordZ(long triple) { + return (((triple >> 34) & 0x3FFFFFF) << 38) >> 38; + } + + public static final short tripleBlockCoord(int x, int y, int z) { return (short) ((x & 15) << 12 | (z & 15) << 8 | y); } - public static char tripleBlockCoordChar(int x, int y, int z) { + public static final char tripleBlockCoordChar(int x, int y, int z) { return (char) ((x & 15) << 12 | (z & 15) << 8 | y); } - public static int untripleBlockCoordX(int triple) { + public static final int untripleBlockCoordX(int triple) { return (triple >> 12) & 0xF; } - public static int untripleBlockCoordY(int triple) { + public static final int untripleBlockCoordY(int triple) { return (triple & 0xFF); } - public static int untripleBlockCoordZ(int triple) { + public static final int untripleBlockCoordZ(int triple) { return (triple >> 8) & 0xF; } @@ -204,27 +231,31 @@ public class MathMan { return y3 + (y2 << 4) + (y1 << 12); } - public static int unpairIntX(long pair) { + public static final long chunkXZ2Int(int x, int z) { + return (long) x & 4294967295L | ((long) z & 4294967295L) << 32; + } + + public static final int unpairIntX(long pair) { return (int) (pair >> 32); } - public static int unpairIntY(long pair) { + public static final int unpairIntY(long pair) { return (int) pair; } - public static byte pair16(int x, int y) { + public static final byte pair16(int x, int y) { return (byte) (x + (y << 4)); } - public static byte unpair16x(byte value) { + public static final byte unpair16x(byte value) { return (byte) (value & 0xF); } - public static byte unpair16y(byte value) { + public static final byte unpair16y(byte value) { return (byte) ((value >> 4) & 0xF); } - public static byte pair8(int x, int y) { + public static final byte pair8(int x, int y) { return (byte) (x + (y << 3)); } @@ -236,14 +267,18 @@ public class MathMan { return (byte) ((value >> 3) & 0x7F); } - public static int gcd(int a, int b) { + public static final int lossyFastDivide(int a, int b) { + return (a * ((1 << 16) / b)) >> 16; + } + + public static final int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } - public static int gcd(int[] a) { + public static final int gcd(int[] a) { int result = a[0]; for (int i = 1; i < a.length; i++) { result = gcd(result, a[i]); @@ -252,7 +287,15 @@ public class MathMan { } - public static double getMean(double[] array) { + 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) { double count = 0; for (double i : array) { count += i; @@ -267,24 +310,50 @@ public class MathMan { * @param pitch * @return */ - public static float[] getDirection(float yaw, float pitch) { + public static final 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 int roundInt(double value) { + public static final int roundInt(double value) { return (int) (value < 0 ? (value == (int) value) ? value : value - 1 : value); } - public static float sqrtApprox(float f) { + /** + * 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) { return f * Float.intBitsToFloat(0x5f375a86 - (Float.floatToIntBits(f) >> 1)); } - public static double sqrtApprox(double d) { - return Double.longBitsToDouble(((Double.doubleToLongBits(d) - (1L << 52)) >> 1) + (1L << 61)); + public static final double sqrtApprox(double d) { + return Double.longBitsToDouble(((Double.doubleToLongBits(d) - (1l << 52)) >> 1) + (1l << 61)); } - public static boolean isInteger(CharSequence str) { + 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) { if (str == null) { return false; } @@ -308,8 +377,41 @@ public class MathMan { return true; } - public static int absByte(int value) { + 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) { 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 496699640..4aa7f465b 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,7 +1,6 @@ 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; @@ -9,8 +8,6 @@ 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(); @@ -31,7 +28,8 @@ public class MemUtil { } public static long getUsedBytes() { - return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); + long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); + return used; } public static long getFreeBytes() { @@ -53,16 +51,17 @@ 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 a92b18074..84c903bb9 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,6 +16,14 @@ 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; @@ -33,12 +41,4 @@ 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 7b93dc410..461f760e4 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,13 +8,14 @@ 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; @@ -49,9 +50,7 @@ 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); @@ -74,9 +73,7 @@ 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); } @@ -90,9 +87,7 @@ 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 5324f24b8..8ab6b1cda 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,9 +1,5 @@ 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; @@ -11,12 +7,11 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; + +import sun.reflect.ConstructorAccessor; +import sun.reflect.FieldAccessor; +import sun.reflect.ReflectionFactory; /** * @author DPOH-VAR @@ -24,8 +19,6 @@ import java.util.Map; */ @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; } @@ -59,21 +52,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); @@ -114,9 +107,7 @@ 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); @@ -127,7 +118,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; @@ -141,7 +132,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)); } @@ -189,12 +180,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); @@ -207,9 +198,7 @@ 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); @@ -316,25 +305,19 @@ 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; } } @@ -455,7 +438,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 bb77c7119..0270b5f16 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,11 +2,7 @@ package com.boydti.fawe.util; import sun.misc.Unsafe; -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.lang.reflect.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -33,12 +29,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); @@ -46,7 +42,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); @@ -121,11 +117,8 @@ 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 a7f52b6c2..28a174870 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,7 +5,6 @@ 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; @@ -22,29 +21,61 @@ 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(); @@ -139,7 +170,16 @@ public class SetQueue { e.printStackTrace(); } if (pool.getQueuedSubmissionCount() != 0 || pool.getRunningThreadCount() != 0 || pool.getQueuedTaskCount() != 0) { - pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS); +// 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); +// } } queue.endSet(parallel); } catch (Throwable e) { @@ -148,31 +188,6 @@ 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(); } @@ -226,9 +241,7 @@ 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); @@ -431,8 +444,4 @@ 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 c5753804a..9d23d38d4 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,6 +1,7 @@ package com.boydti.fawe.util; -import java.awt.*; +import java.awt.Rectangle; +import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.FlatteningPathIterator; import java.awt.geom.IllegalPathStateException; @@ -53,6 +54,53 @@ 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]; @@ -90,53 +138,6 @@ 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; @@ -262,8 +263,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 @@ -272,8 +273,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: @@ -349,24 +350,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, @@ -671,21 +672,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) { @@ -696,7 +697,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 6ca6bfe66..f621d01cd 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,5 +1,7 @@ package com.boydti.fawe.util; +import com.sk89q.util.StringUtil; + import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; @@ -10,6 +12,9 @@ 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) { @@ -35,9 +40,7 @@ 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; } @@ -45,9 +48,7 @@ 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; @@ -64,17 +65,10 @@ 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) { @@ -84,31 +78,21 @@ 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; } } @@ -155,9 +139,7 @@ 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; @@ -176,15 +158,11 @@ 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); @@ -369,9 +347,7 @@ 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) { @@ -379,9 +355,7 @@ public class StringMan { case ':': case '_': sequentail = false; - if (bj == ai) { - break outer; - } + if (bj == ai) break outer; continue; } continue; @@ -481,9 +455,8 @@ 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 cb29f84e3..368853e91 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 d97a4f272..84d3af4ad 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,19 +1,25 @@ 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; @@ -21,330 +27,19 @@ import it.unimi.dsi.fastutil.longs.LongArrayList; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.io.*; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; -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.*; 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 { - - 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 class TextureUtil implements TextureHolder { public static TextureUtil fromClipboard(Clipboard clipboard) throws FileNotFoundException { boolean[] ids = new boolean[BlockTypes.size()]; @@ -380,25 +75,312 @@ 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; @@ -453,6 +435,8 @@ TextureUtil implements TextureHolder { return BlockTypes.get(closest); } + private BlockType[] layerBuffer = new BlockType[2]; + /** * Returns the block combined ids as an array * @@ -498,14 +482,14 @@ 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; @@ -605,7 +589,7 @@ 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); @@ -622,7 +606,7 @@ 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); @@ -659,7 +643,7 @@ 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"); @@ -669,7 +653,7 @@ 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); @@ -685,7 +669,7 @@ TextureUtil implements TextureHolder { } textureFileName = - String.format(texturesDir, nameSpace, models.iterator().next()); + String.format(texturesDir, nameSpace, models.iterator().next()); } BufferedImage image = readImage(zipFile, textureFileName); @@ -703,7 +687,7 @@ 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); @@ -712,16 +696,16 @@ 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); @@ -732,10 +716,9 @@ TextureUtil implements TextureHolder { biomes[134].grass = 0; // roofed forest: averaged w/ 0x28340A biomes[29].grass = - //TODO the following expressions will always overflow because they will be bigger than MAX_INT - multiplyColor(biomes[29].grass, 0x28340A + (255 << 24)); + 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); @@ -747,12 +730,12 @@ 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[0]); + this.validBiomes = valid.toArray(new BiomeColor[valid.size()]); { ArrayList uniqueColors = new ArrayList<>(); @@ -775,13 +758,13 @@ 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))); } } } @@ -906,7 +889,7 @@ 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}); } } } @@ -991,7 +974,22 @@ 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); + * 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); } public long getDistance(BufferedImage image, int c1) { @@ -1012,10 +1010,6 @@ TextureUtil implements TextureHolder { return totalDistSqr / area; } - public int[] getValidBlockIds() { - return validBlockIds.clone(); - } - public static class BiomeColor { public int id; public String name; @@ -1026,7 +1020,7 @@ 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; @@ -1036,4 +1030,8 @@ 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 0f83a7be5..1b315f004 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,12 +14,9 @@ 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.ArrayDeque; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public class WEManager { @@ -127,9 +124,7 @@ public class WEManager { } } } - if (!removed) { - return regions.toArray(new Region[0]); - } + if (!removed) return regions.toArray(new Region[0]); masks.clear(); } } @@ -137,16 +132,12 @@ 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(); @@ -164,10 +155,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 997654b06..46a74b7f1 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,7 +5,6 @@ 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 { @@ -98,11 +97,9 @@ 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; } @@ -135,10 +132,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 f3e2f2694..d39fd2228 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,7 +3,6 @@ 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; @@ -21,12 +20,10 @@ 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) { @@ -43,10 +40,8 @@ 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) { - } -} + public void link(Message message, String url) {} +} \ No newline at end of file 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 9c26d2921..313bb6275 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,14 +85,12 @@ 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 + ">"); } @@ -106,9 +104,7 @@ 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(); @@ -145,9 +141,7 @@ 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 1a9594283..7ba9553c3 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,7 +7,9 @@ import com.boydti.fawe.util.MathMan; import com.sk89q.worldedit.util.command.parametric.ParameterException; import javax.annotation.Nullable; -import java.awt.*; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.Transparency; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.io.File; @@ -23,56 +25,54 @@ 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 width, height; + int w, h; if (higherQuality) { // Use multi-step technique: start with original size, then // scale down in multiple passes with drawImage() // until the target size is reached - width = ret.getWidth(); - height = ret.getHeight(); + w = ret.getWidth(); + h = ret.getHeight(); } else { // Use one-step technique: scale directly from original // size to target size with a single drawImage() call - width = targetWidth; - height = targetHeight; + w = targetWidth; + h = targetHeight; } do { - if (higherQuality && width > targetWidth) { - width /= 2; - if (width < targetWidth) { - width = targetWidth; + if (higherQuality && w > targetWidth) { + w /= 2; + if (w < targetWidth) { + w = targetWidth; } - } else if (width < targetWidth) { - width = targetWidth; - } + } else if (w < targetWidth) w = targetWidth; - if (higherQuality && height > targetHeight) { - height /= 2; - if (height < targetHeight) { - height = targetHeight; + if (higherQuality && h > targetHeight) { + h /= 2; + if (h < targetHeight) { + h = targetHeight; } - } else if (height < targetHeight) { - height = targetHeight; - } + } else if (h < targetHeight) h = targetHeight; - BufferedImage tmp = new BufferedImage(width, height, type); + BufferedImage tmp = new BufferedImage(w, h, 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, width, height, null); + g2.drawImage(ret, 0, 0, w, h, null); g2.dispose(); ret = tmp; - } while (width != targetWidth || height != targetHeight); + } while (w != targetWidth || h != targetHeight); return ret; } @@ -107,9 +107,8 @@ 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 76af804db..ba3771651 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 c94f09396..74b7959cf 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,7 +6,6 @@ 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; @@ -19,12 +18,6 @@ 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); @@ -175,9 +168,7 @@ 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; @@ -185,9 +176,7 @@ 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; @@ -195,9 +184,7 @@ 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; @@ -205,9 +192,7 @@ 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; @@ -329,15 +314,6 @@ 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 @@ -346,6 +322,13 @@ 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; @@ -354,6 +337,14 @@ 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 @@ -396,14 +387,6 @@ public class TaskBuilder extends Metadatable { }; } - public void abortNextTasks() { - this.aborted = true; - } - - public boolean isAborted() { - return aborted; - } - public abstract T exec(Object previous); @Override @@ -418,6 +401,13 @@ 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 @@ -435,13 +425,6 @@ 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 { @@ -503,9 +486,7 @@ public class TaskBuilder extends Metadatable { try { if (!finished) { synchronized (asyncWaitLock) { - while (!waitingAsync) { - asyncWaitLock.wait(1); - } + while (!waitingAsync) asyncWaitLock.wait(1); asyncWaitLock.notifyAll(); } waitingSync = true; @@ -530,9 +511,7 @@ 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; @@ -547,4 +526,14 @@ 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 76a8b56c6..698cb3dfd 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,6 +2,7 @@ package com.boydti.fawe.util.terrain; import java.util.Arrays; + import static com.boydti.fawe.util.MathMan.pairInt; public final class Erosion { @@ -30,4 +31,5 @@ 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 28e4acb67..03c708844 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java @@ -20,12 +20,16 @@ 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; @@ -36,7 +40,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.

@@ -48,7 +52,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 */ @@ -66,7 +70,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. */ @@ -80,13 +84,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. @@ -98,7 +102,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 { @@ -518,7 +522,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 @@ -607,7 +611,7 @@ public final class NBTInputStream implements Closeable { @Override public void close() throws IOException { - if (is != null) { + if (is instanceof AutoCloseable) { 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 new file mode 100644 index 000000000..af1392e4a --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/CuboidClipboard.java @@ -0,0 +1,482 @@ +/* + * 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 a4088e5a3..8968ab652 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -151,7 +151,6 @@ 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; @@ -424,7 +423,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); } @@ -463,7 +462,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(); } @@ -495,12 +494,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 != null && !(get instanceof NullExtent)) { + if (get instanceof AbstractDelegateExtent && !(get instanceof NullExtent)) { traverser.setNext(nullExtent); } traverser = next; @@ -739,7 +738,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; } @@ -749,16 +748,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() != null) { + while (traverser != null && traverser.get() instanceof ResettableExtent) { traverser = traverser.next(); next = traverser.get(); } @@ -770,9 +769,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 traverser.get(); + return (ResettableExtent) traverser.get(); } return null; } @@ -788,7 +787,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) { @@ -827,7 +826,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) { @@ -845,13 +844,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; } } @@ -878,21 +877,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 = afterHistory.get(); + extent = (AbstractDelegateExtent) 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); } } @@ -951,7 +950,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 { @@ -1411,7 +1410,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); @@ -3359,7 +3358,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) { @@ -3385,19 +3384,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 6b80d6658..5e2bdd9b8 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,9 +33,12 @@ 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 @@ -49,7 +52,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) { @@ -91,10 +94,10 @@ public class FlattenedClipboardTransform { Vector3 newMinimum = corners[0]; Vector3 newMaximum = corners[0]; - for (int i = 1; i < corners.length; i++) { - newMinimum = newMinimum.getMinimum(corners[i]); - newMaximum = newMaximum.getMaximum(corners[i]); + Vector3 cbv = corners[i]; + newMinimum = newMinimum.getMinimum(cbv); + newMaximum = newMaximum.getMaximum(cbv); } // After transformation, the points may not really sit on a block, @@ -122,7 +125,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 */ @@ -130,4 +133,5 @@ 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 93b6b7b6a..9edebfa3d 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,6 +31,7 @@ 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; @@ -43,16 +44,17 @@ 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; @@ -61,9 +63,7 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; -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; +import static com.sk89q.minecraft.util.commands.Logging.LogMode.*; /** @@ -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 { + 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 { 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 { + public void ores(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, CommandContext context) throws WorldEditException, ParameterException { 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, 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, ParameterException, 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 { + 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 { 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 { - int max = Math.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, ParameterException { + double max = MathMan.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), max, context); + }, getArguments(context), (int) 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 { - int max = Math.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, ParameterException { + double max = MathMan.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), max, context); + }, getArguments(context), (int) 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 { + public void hsphere(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, BlockVector3 radius, @Optional("false") boolean raised, CommandContext context) throws WorldEditException, ParameterException { 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 { + 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 { double max = MathMan.max(radius.getBlockX(), radius.getBlockY(), radius.getBlockZ()); worldEdit.checkMaxRadius(max); BlockVector3 pos = session.getPlacementPosition(player); @@ -276,37 +276,36 @@ public class GenerationCommands extends MethodCommands { } @Command( - aliases = { "forestgen" }, - usage = "[size] [type] [density]", - desc = "Generate a forest", - min = 0, - max = 3 + aliases = {"forestgen"}, + usage = "[size] [tree-type] [density]", + desc = "Generate a forest", + min = 0, + max = 3 ) @CommandPermissions("worldedit.generation.forest") @Logging(POSITION) - 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 { + @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 { density = density / 100; int affected = editSession.makeForest(session.getPlacementPosition(player), size, density, type); - player.print(affected + " trees created."); + player.print(BBC.getPrefix() + affected + " trees created."); } @Command( - aliases = { "pumpkins" }, - usage = "[size]", - desc = "Generate pumpkin patches", - min = 0, - max = 1 + aliases = {"pumpkins"}, + usage = "[size=10]", + desc = "Generate pumpkin patches", + max = 2 ) @CommandPermissions("worldedit.generation.pumpkins") @Logging(POSITION) - public void pumpkins(Player player, LocalSession session, EditSession editSession, @Optional("10") int apothem) throws WorldEditException { + public void pumpkins(Player player, LocalSession session, EditSession editSession, @Optional("10") int apothem) throws WorldEditException, ParameterException { 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, @@ -314,21 +313,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 { + public void hollowPyramid(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, @Range(min = 1) int size, CommandContext context) throws WorldEditException, ParameterException { 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 { + 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 { BlockVector3 pos = session.getPlacementPosition(player); worldEdit.checkMaxRadius(size); fp.checkConfirmationRadius(() -> { @@ -337,7 +336,7 @@ public class GenerationCommands extends MethodCommands { BBC.VISITOR_BLOCK.send(fp, affected); }, getArguments(context), size, context); } - + @Command( aliases = {"/generate", "/gen", "/g"}, @@ -395,7 +394,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(() -> { @@ -465,9 +464,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 28bebed85..072a957c4 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,8 +50,6 @@ 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. */ @@ -65,11 +63,10 @@ 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" + @@ -83,72 +80,74 @@ public class HistoryCommands extends MethodCommands { BBC.SETTING_DISABLE.send(player, "history.use-database (Import with /frb #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; + switch (user.charAt(0)) { + case '#': { + if (user.equals("#import")) { + if (!player.hasPermission("fawe.rollback.import")) { + BBC.NO_PERM.send(player, "fawe.rollback.import"); + return; } - 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); - } + 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); + } + } + } 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) { @@ -197,11 +196,16 @@ public class HistoryCommands extends MethodCommands { BBC.ROLLBACK_ELEMENT.send(player, Fawe.imp().getWorldName(edit.getWorld()) + "/" + user + "-" + edit.getIndex()); count.incrementAndGet(); } - }, () -> BBC.TOOL_INSPECT_INFO_FOOTER.send(player, count), true, restore); + }, new Runnable() { + @Override + public void run() { + 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" + @@ -215,30 +219,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 args) throws WorldEditException { + public void undo(Player player, LocalSession session, CommandContext context) throws WorldEditException { if (session.hasFastMode()) { BBC.COMMAND_UNDO_DISABLED.send(player); return; } - int times = Math.max(1, args.getInteger(0, 1)); + int times = Math.max(1, context.getInteger(0, 1)); FawePlayer.wrap(player).checkConfirmation(() -> { EditSession undone = null; int i = 0; for (; i < times; ++i) { - if (args.argsLength() < 2) { + if (context.argsLength() < 2) { undone = session.undo(session.getBlockBag(player), player); } else { player.checkPermission("worldedit.history.undo.other"); - LocalSession sess = worldEdit.getSessionManager().findByName(args.getString(1)); + LocalSession sess = worldEdit.getSessionManager().findByName(context.getString(1)); if (sess == null) { - BBC.COMMAND_HISTORY_OTHER_ERROR.send(player, args.getString(1)); + BBC.COMMAND_HISTORY_OTHER_ERROR.send(player, context.getString(1)); break; } undone = sess.undo(session.getBlockBag(player), player); @@ -253,19 +257,18 @@ public class HistoryCommands extends MethodCommands { if (undone == null) { BBC.COMMAND_UNDO_ERROR.send(player); } - }, getArguments(args), times, 50, args); + }, getArguments(context), times, 50, context); } @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; @@ -295,11 +298,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 { @@ -308,4 +311,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 a4c964a7b..c00cd587b 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 { - BBC.UNSTUCK.send(player); player.findFreePosition(); + BBC.UNSTUCK.send(player); } @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,4 +231,6 @@ 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 48e028ddc..a538527ee 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("//line only works with cuboid selections"); + player.printError(BBC.getPrefix() + "//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.toWorldEditPlayer().printError("//curve only works with convex polyhedral selections"); + player.sendMessage(BBC.getPrefix() + "//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.smooth") + @CommandPermissions("worldedit.region.smoothsnow") @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 = "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 + 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 ) @CommandPermissions("worldedit.region.move") @Logging(ORIENTATION_REGION) - public void move(FawePlayer player, EditSession editSession, LocalSession session, + public void move(FawePlayer player, LocalSession session, EditSession editSession, @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.toWorldEditPlayer().printError(e.getMessage()); + player.sendMessage(BBC.getPrefix() + 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, EditSession editSession, LocalSession session, + public void stack(FawePlayer player, LocalSession session, EditSession editSession, @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(e.getMessage()); + player.sendMessage(BBC.getPrefix() + 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(e.getMessage()); + fp.sendMessage(BBC.getPrefix() + 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,14 +776,15 @@ 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 8a6f8cf7f..dd26d49f8 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,22 +29,21 @@ 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.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; +import java.io.*; 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; @@ -62,7 +61,7 @@ public class ScriptingCommands { * * @param worldEdit reference to WorldEdit */ - public ScriptingCommands(WorldEdit worldEdit) { + public ScriptingCommands(final WorldEdit worldEdit) { checkNotNull(worldEdit); this.worldEdit = worldEdit; } @@ -79,12 +78,16 @@ 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); + String ext = filename.substring(index + 1, filename.length()); if (!ext.equalsIgnoreCase("js")) { - player.printError("Only .js scripts are currently supported"); + actor.printError(BBC.getPrefix() + "Only .js scripts are currently supported"); return null; } @@ -97,63 +100,69 @@ public class ScriptingCommands { file = WorldEdit.class.getResourceAsStream("craftscripts/" + filename); if (file == null) { - player.printError("Script does not exist: " + filename); + actor.printError(BBC.getPrefix() + "Script does not exist: " + filename); return null; } } else { file = new FileInputStream(f); } - 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); + 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"); } catch (IOException e) { - player.printError("Script read error: " + e.getMessage()); + actor.printError(BBC.getPrefix() + "Script read error: " + e.getMessage()); return null; } - WorldEdit worldEdit1 = WorldEdit.getInstance(); - LocalSession session = worldEdit1.getSessionManager().get(player); + if (processor != null) { + script = processor.apply(script); + } - CraftScriptEngine engine; + WorldEdit worldEdit = WorldEdit.getInstance(); + LocalSession session = worldEdit.getSessionManager().get(actor); + + CraftScriptEngine engine = null; Object result = null; try { engine = new RhinoCraftScriptEngine(); } catch (NoClassDefFoundError e) { - 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/"); + 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/"); return null; } - engine.setTimeLimit(worldEdit1.getConfiguration().scriptTimeout); + engine.setTimeLimit(worldEdit.getConfiguration().scriptTimeout); - CraftScriptContext scriptContext = new CraftScriptContext(worldEdit1, worldEdit1.getPlatformManager().queryCapability(Capability.USER_COMMANDS), - worldEdit1.getConfiguration(), session, player, args); + 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); Map vars = new HashMap<>(); vars.put("argv", args); vars.put("context", scriptContext); - vars.put("actor", player); + vars.put("actor", actor); vars.put("player", player); try { result = engine.evaluate(script, filename, vars); } catch (ScriptException e) { e.printStackTrace(); - player.printError(BBC.getPrefix() + "Failed to execute:"); - player.printRaw(e.getMessage()); - } catch (NumberFormatException | WorldEditException e) { + actor.printError(BBC.getPrefix() + "Failed to execute:"); + actor.printRaw(e.getMessage()); + } catch (NumberFormatException e) { + throw e; + } catch (WorldEditException e) { throw e; } catch (Throwable e) { - player.printError("Failed to execute (see console):"); - player.printRaw(e.getClass().getCanonicalName()); + actor.printError(BBC.getPrefix() + "Failed to execute (see console):"); + actor.printRaw(e.getClass().getCanonicalName()); e.printStackTrace(); } if (result instanceof NativeJavaObject) { @@ -162,19 +171,12 @@ 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(Player player, LocalSession session, CommandContext args) throws WorldEditException { - - String[] scriptArgs = args.getSlice(1); - String name = args.getString(0); + 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); if (!player.hasPermission("worldedit.scripting.execute." + name)) { BBC.SCRIPTING_NO_PERM.send(player); @@ -183,8 +185,8 @@ public class ScriptingCommands { session.setLastScript(name); - File dir = worldEdit.getWorkingDirectoryFile(worldEdit.getConfiguration().scriptsDir); - File f = worldEdit.getSafeOpenFile(player, dir, name, "js", "js"); + final File dir = this.worldEdit.getWorkingDirectoryFile(this.worldEdit.getConfiguration().scriptsDir); + final File f = this.worldEdit.getSafeOpenFile(player, dir, name, "js", "js"); try { new RhinoCraftScriptEngine(); } catch (NoClassDefFoundError e) { @@ -197,17 +199,11 @@ 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)) { @@ -220,11 +216,17 @@ public class ScriptingCommands { return; } - String[] scriptArgs = args.getSlice(0); + final String[] scriptArgs = args.getSlice(0); - File dir = worldEdit.getWorkingDirectoryFile(worldEdit.getConfiguration().scriptsDir); - File f = worldEdit.getSafeOpenFile(player, dir, lastScript, "js", "js"); + final File dir = this.worldEdit.getWorkingDirectoryFile(this.worldEdit.getConfiguration().scriptsDir); + final File f = this.worldEdit.getSafeOpenFile(player, dir, lastScript, "js", "js"); - worldEdit.runScript(player, f, scriptArgs); + try { + this.worldEdit.runScript(LocationMaskedPlayerWrapper.unwrap(player), f, scriptArgs); + } catch (final WorldEditException ex) { + BBC.SCRIPTING_ERROR.send(player); + } } + + } 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 deff381ae..20f6fd0f0 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,16 +123,15 @@ 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") @@ -163,40 +162,38 @@ 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) throws WorldEditException { - - Location pos = player.getBlockTrace(300); + public void hpos1(Player player, LocalSession session, CommandContext args) throws WorldEditException { + BlockVector3 pos = player.getBlockTrace(300).toBlockPoint(); if (pos != null) { - if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos.toVector().toBlockPoint(), ActorSelectorLimits.forActor(player))) { + if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos, ActorSelectorLimits.forActor(player))) { BBC.SELECTOR_ALREADY_SET.send(player); return; } session.getRegionSelector(player.getWorld()) - .explainPrimarySelection(player, session, pos.toVector().toBlockPoint()); + .explainPrimarySelection(player, session, pos); } 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) throws WorldEditException { - + public void hpos2(Player player, LocalSession session, CommandContext args) throws WorldEditException { BlockVector3 pos = player.getBlockTrace(300).toBlockPoint(); if (pos != null) { @@ -213,20 +210,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") @@ -282,15 +279,14 @@ public class SelectionCommands { } @Command( - aliases = { "/wand" }, - usage = "", - desc = "Get the wand object", - min = 0, - max = 0 + aliases = {"/wand", "/w"}, + 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")) @@ -298,11 +294,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 { @@ -317,11 +313,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") @@ -329,8 +325,7 @@ 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(); @@ -347,7 +342,6 @@ public class SelectionCommands { return; } - List dirs = new ArrayList<>(); int change = args.getInteger(0); int reverseChange = 0; @@ -406,16 +400,15 @@ 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") @@ -485,11 +478,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") @@ -519,7 +512,6 @@ 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()); @@ -527,17 +519,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") @@ -550,17 +542,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") @@ -577,32 +569,33 @@ public class SelectionCommands { int change = args.getInteger(0); if (!args.hasFlag('h')) { - changes.add((BlockVector3.UNIT_Y).multiply(change)); - changes.add((BlockVector3.UNIT_MINUS_Y).multiply(change)); + changes.add((BlockVector3.at(0, 1, 0)).multiply(change)); + changes.add((BlockVector3.at(0, -1, 0)).multiply(change)); } if (!args.hasFlag('v')) { - 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)); + 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)); } 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, CommandContext args) throws WorldEditException { + public void size(Player player, LocalSession session, EditSession editSession, 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(); @@ -675,12 +668,12 @@ public class SelectionCommands { @Command( - aliases = { "/count" }, - usage = "", - flags = "d", - desc = "Counts the number of a certain type of block", - min = 1, - max = 1 + aliases = {"/count"}, + usage = "", + desc = "Counts the number of a certain type of block", + flags = "d", + min = 1, + max = 1 ) @CommandPermissions("worldedit.analysis.count") public void count(Player player, LocalSession session, EditSession editSession, Mask mask) throws WorldEditException { @@ -689,25 +682,23 @@ 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.\n" + - "The -d flag separates blocks by state", - flags = "cd", - 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.", + flags = "c", + min = 0, + max = 0 ) @CommandPermissions("worldedit.analysis.distr") - public void distr(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException, CommandException { + public void distr(Player player, LocalSession session, EditSession editSession, @Switch('c') boolean useClipboard, @Switch('d') boolean useData) throws WorldEditException, CommandException { int size; List distributionData; - boolean separateStates = args.hasFlag('d'); Region region; - if (args.hasFlag('c')) { + if (useClipboard) { // TODO multi clipboard distribution Clipboard clipboard = session.getClipboard().getClipboard(); region = clipboard.getRegion(); @@ -715,14 +706,13 @@ public class SelectionCommands { } else { region = session.getSelection(player.getWorld()); } - if (separateStates) { + if (useData) distributionData = (List) editSession.getBlockDistributionWithData(region); - } else { + else distributionData = (List) editSession.getBlockDistribution(region); - } size = session.getSelection(player.getWorld()).getArea(); - if (distributionData.isEmpty()) { // *Should* always be false + if (distributionData.size() <= 0) { player.printError("No blocks counted."); return; } @@ -739,12 +729,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(); @@ -848,4 +838,5 @@ 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 308f42d6d..178811dfa 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((i + 1) + ". " + snapshots.get(i).getName()); + player.print(BBC.getPrefix() + (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("WorldEdit found no snapshots: looked in: " + WorldEdit.logger.info(BBC.getPrefix() + "WorldEdit found no snapshots: looked in: " + dir.getCanonicalPath()); } catch (IOException e) { - WorldEdit.logger.info("WorldEdit found no snapshots: looked in " + WorldEdit.logger.info(BBC.getPrefix() + "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("Couldn't find a snapshot before " + player.printError(BBC.getPrefix() + "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("Couldn't find a snapshot after " + player.printError(BBC.getPrefix() + "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 4f2c95f31..446277b9a 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,7 +56,6 @@ public class SnapshotUtilCommands { aliases = { "restore", "/restore" }, usage = "[snapshot]", desc = "Restore the selection from a snapshot", - min = 0, max = 1 ) @Logging(REGION) @@ -112,20 +111,14 @@ public class SnapshotUtilCommands { } } - ChunkStore chunkStore = null; // Load chunk store - try { - chunkStore = snapshot.getChunkStore(); + SnapshotRestore restore; + try (ChunkStore 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 - SnapshotRestore restore = new SnapshotRestore(chunkStore, editSession, region); + restore = new SnapshotRestore(chunkStore, editSession, region); //player.print(restore.getChunksAffected() + " chunk(s) will be loaded."); restore.restore(); @@ -140,15 +133,12 @@ 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())); } - } finally { - try { - chunkStore.close(); - } catch (IOException ignored) { - } + } catch (DataException | IOException e) { + player.printError("Failed to load snapshot: " + e.getMessage()); } } } 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 08a37900c..ce5f0054f 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 5ba418051..2d9e6c62e 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,17 +60,16 @@ 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()); } @@ -78,114 +77,104 @@ 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 { - BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); - session.setTool(itemStack.getType(), new InspectBrush()); - BBC.TOOL_INSPECT.send(player, itemStack.getType().getName()); + session.setTool(new InspectBrush(), player); + BBC.TOOL_INSPECT.send(player, player.getItemInHand(HandSide.MAIN_HAND).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 { - BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); - session.setTool(itemStack.getType(), new TreePlanter(type)); - BBC.TOOL_TREE.send(player, itemStack.getType().getName()); + session.setTool(new TreePlanter(type), player); + BBC.TOOL_TREE.send(player, player.getItemInHand(HandSide.MAIN_HAND).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 { - BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); - session.setTool(itemStack.getType(), new BlockReplacer(pattern)); - BBC.TOOL_REPL.send(player, itemStack.getType().getName()); + session.setTool(new BlockReplacer(pattern), player); + BBC.TOOL_REPL.send(player, player.getItemInHand(HandSide.MAIN_HAND).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 { - BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); - session.setTool(itemStack.getType(), new BlockDataCyler()); - BBC.TOOL_CYCLER.send(player, itemStack.getType().getName()); + session.setTool(new BlockDataCyler(), player); + BBC.TOOL_CYCLER.send(player, player.getItemInHand(HandSide.MAIN_HAND).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, LocalSession session, Pattern pattern, int range) throws WorldEditException { - + public void floodFill(Player player, EditSession editSession, 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; } - - BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); - session.setTool(itemStack.getType(), new FloodFillTool(range, pattern)); - BBC.TOOL_FLOOD_FILL.send(player, itemStack.getType().getName()); + session.setTool(new FloodFillTool(range, pattern), player); + BBC.TOOL_FLOOD_FILL.send(player, player.getItemInHand(HandSide.MAIN_HAND).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) throws WorldEditException { - - BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); - session.setTool(itemStack.getType(), new FloatingTreeRemover()); + public void deltree(Player player, LocalSession session, CommandContext args) throws WorldEditException { + session.setTool(new FloatingTreeRemover(), player); 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) throws WorldEditException { - - BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); - session.setTool(itemStack.getType(), new DistanceWand()); - BBC.TOOL_FARWAND.send(player, itemStack.getType().getName()); + 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()); } @Command( - aliases = { "lrbuild", "/lrbuild" }, + aliases = {"lrbuild", "/lrbuild"}, usage = " ", desc = "Long-range building tool", min = 2, @@ -193,10 +182,8 @@ public class ToolCommands { ) @CommandPermissions("worldedit.tool.lrbuild") public void longrangebuildtool(Player player, LocalSession session, Pattern secondary, Pattern primary) throws WorldEditException { - BaseItemStack itemStack = player.getItemInHand(HandSide.MAIN_HAND); - - session.setTool(itemStack.getType(), new LongRangeBuildTool(primary, secondary)); - BBC.TOOL_LRBUILD_BOUND.send(player, itemStack.getType().getName()); + session.setTool(new LongRangeBuildTool(primary, secondary), player); + BBC.TOOL_LRBUILD_BOUND.send(player, player.getItemInHand(HandSide.MAIN_HAND).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 3e77d232e..4d2258064 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("Super pick axe already enabled."); + player.printError(BBC.getPrefix() + "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("Super pick axe already disabled."); + player.printError(BBC.getPrefix() + "Super pick axe already disabled."); return; } session.enableSuperPickAxe(); @@ -130,7 +130,6 @@ 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 89223fde9..3e1be3564 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(affected + " block(s) have been created."); + player.print(BBC.getPrefix() + 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(affected + " block(s) have been created."); + player.print(BBC.getPrefix() + 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(affected + " block(s) have been changed."); + player.print(BBC.getPrefix() + 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(affected + " block(s) have been changed."); + int affected = editSession.fixLiquid( + session.getPlacementPosition(player), radius, BlockTypes.LAVA); + player.print(BBC.getPrefix() + 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(affected + " surfaces covered. Let it snow~"); + player.print(BBC.getPrefix() + 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(affected + " surfaces thawed."); + player.print(BBC.getPrefix() + 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("= " + result); + actor.print(BBC.getPrefix() + "= " + 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,14 +667,13 @@ 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 6851fe2b2..b6d7c7838 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,31 +1,12 @@ -/* - * 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; @@ -49,11 +30,11 @@ public class AreaPickaxe implements BlockTool { } @Override - public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, com.sk89q.worldedit.util.Location clicked) { + public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { int ox = clicked.getBlockX(); int oy = clicked.getBlockY(); int oz = clicked.getBlockZ(); - BlockType initialType = clicked.getExtent().getBlock(clicked.toVector().toBlockPoint()).getBlockType(); + BlockType initialType = clicked.getExtent().getBlock(clicked.toBlockPoint()).getBlockType(); if (initialType.getMaterial().isAir()) { return true; @@ -64,9 +45,8 @@ 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) { @@ -78,14 +58,10 @@ 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 0e983f20d..5591d341d 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,7 +56,8 @@ public class BlockDataCyler implements DoubleActionBlockTool { World world = (World) clicked.getExtent(); - BlockVector3 blockPoint = clicked.toVector().toBlockPoint(); +// BlockStateHolder block = world.getBlock(clicked); + BlockVector3 blockPoint = clicked.toBlockPoint(); BlockState block = world.getBlock(blockPoint); if (!config.allowedDataCycleBlocks.isEmpty() @@ -67,42 +68,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("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()); - } + 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()); + } } 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 9964cd62a..fe6589777 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,6 +19,7 @@ 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; @@ -31,9 +32,10 @@ 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 { @@ -72,11 +74,13 @@ public class BlockReplacer implements DoubleActionBlockTool { @Override public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, com.sk89q.worldedit.util.Location clicked) { - BlockState targetBlock = player.getWorld().getBlock(clicked.toVector().toBlockPoint()); + EditSession editSession = session.createEditSession(player); + BlockStateHolder targetBlock = (editSession).getBlock(clicked.toBlockPoint()); + BlockType type = targetBlock.getBlockType(); - if (targetBlock != null) { - pattern = new BlockPattern(targetBlock); - player.print("Replacer tool switched to: " + targetBlock.getBlockType().getName()); + if (type != null) { + this.pattern = targetBlock; + player.print(BBC.getPrefix() + "Replacer tool switched to: " + type.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 1b05c8f6b..5e5274b90 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,22 +1,3 @@ -/* - * 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; @@ -263,6 +244,15 @@ 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(); @@ -295,7 +285,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool /** * Set the brush. * - * @param brush tbe brush + * @param brush tbe brush * @param permission the permission */ @Deprecated @@ -337,7 +327,8 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool * * @return the material */ - @Nullable public Pattern getMaterial() { + @Nullable + public Pattern getMaterial() { return getContext().getMaterial(); } @@ -433,7 +424,8 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool return TaskManager.IMP.sync(new RunnableVal() { @Override public void run(Vector3 value) { - this.value = tb.getMaskedTargetBlock(useLastBlock); + Location result = tb.getMaskedTargetBlock(useLastBlock); + this.value = result; } }); } @@ -466,7 +458,6 @@ 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(); @@ -496,7 +487,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool double size = current.getSize(); WorldEdit.getInstance().checkMaxBrushRadius(size); brush.build(editSession, target, current.getMaterial(), size); - } catch (MaxChangedBlocksException e) { + } catch (WorldEditException e) { player.printError("Max blocks change limit reached."); // Never happens } finally { if (bag != null) { @@ -519,6 +510,12 @@ 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(); @@ -560,6 +557,10 @@ 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 e09be2e4b..8f43fce0e 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.toVector().toBlockPoint(); + BlockVector3 blockPoint = target.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 9890b54ee..39c27845d 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,6 +19,7 @@ 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; @@ -37,7 +38,9 @@ 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; /** @@ -67,7 +70,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()); @@ -118,7 +121,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 Set visited = new LocalBlockVectorSet(); + final LocalBlockVectorSet visited = new LocalBlockVectorSet(); final LocalBlockVectorSet queue = new LocalBlockVectorSet(); queue.add(origin); @@ -158,4 +161,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 749641667..594beb60b 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.toVector().toBlockPoint(); + BlockVector3 origin = clicked.toBlockPoint(); BlockType initialType = world.getBlock(origin).getBlockType(); if (initialType.getMaterial().isAir()) { @@ -88,7 +88,6 @@ public class FloodFillTool implements BlockTool { session.remember(editSession); } } - return true; } @@ -121,4 +120,5 @@ 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 c51af3d75..be256f239 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,29 +1,9 @@ -/* - * 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; @@ -37,14 +17,11 @@ 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) { @@ -59,66 +36,32 @@ 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(); - if (initialType.getMaterial().isAir()) { + BlockStateHolder block = editSession.getBlock(pos); + if (block.getBlockType().getMaterial().isAir()) { return true; } - if (initialType == BlockTypes.BEDROCK && !player.canDestroyBedrock()) { + if (block.getBlockType() == BlockTypes.BEDROCK && !player.canDestroyBedrock()) { return true; } - try (EditSession editSession = session.createEditSession(player)) { - editSession.getSurvivalExtent().setToolUse(config.superPickaxeManyDrop); + 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(clicked.toBlockPoint()); - Operations.completeBlindly(visitor); - - editSession.flushQueue(); - session.remember(editSession); - player.printError("Max blocks change limit reached."); - } + 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); + editSession.flushQueue(); + session.remember(editSession); return true; } - - 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); - } - -} +} \ No newline at end of file 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 dbf959e1b..d96a44819 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 = new BlockPattern(BlockTypes.COBBLESTONE.getDefaultState()); + pattern = (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 0e89b3c16..bbba333b3 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 = new BlockPattern(BlockTypes.COBBLESTONE.getDefaultState()); + pattern = (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 2ecf245d1..66a73112b 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.toVector().toBlockPoint(), max); + Region region = new CuboidRegion(editSession.getWorld(), min.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 d8028f2ae..07e852da6 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 = new BlockPattern(BlockTypes.COBBLESTONE.getDefaultState()); + pattern = (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 cc32d4fd8..c94ba677a 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,9 +19,6 @@ 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; @@ -31,20 +28,24 @@ 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 @@ -71,10 +72,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; @@ -96,7 +97,9 @@ 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; } @@ -105,7 +108,9 @@ public class EditSessionEvent extends Event implements Cancellable { * * @return the world */ - public @Nullable World getWorld() { + public + @Nullable + World getWorld() { return world; } @@ -164,7 +169,10 @@ public class EditSessionEvent extends Event implements Cancellable { * @return a new event */ public EditSessionEvent clone(Stage stage) { - return new EditSessionEvent(world, actor, maxBlocks, stage); + EditSessionEvent clone = new EditSessionEvent(world, actor, maxBlocks, stage); + clone.setEditSession(session); + return clone; } + } 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 bcb2d8212..d8dbe0a63 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,7 +25,6 @@ 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; @@ -43,6 +42,7 @@ 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,6 +59,7 @@ 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 4e254109c..58041280d 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(); - return new ExpressionMask(exp, timeout); + // TODO 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 b2e9672f5..9cc922368 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(new BlockPattern(state), 1.0)); + randomPattern.add((state), 1.0)); } else { for (BlockType blockType : blocks) { - randomPattern.add(new BlockPattern(blockType.getDefaultState()), 1.0); + randomPattern.add((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 f0939ed60..1aee6c2a6 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,5 +83,4 @@ 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 68c768954..a836c1615 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,6 +21,7 @@ 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 9eb54eebe..f7d3117e2 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 new BlockPattern(block); + return (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 e71530a2e..3ecf3a9ce 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 new BlockPattern(worldEdit.getBlockFactory().parseFromInput(input, context)); + return (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 e7aeac997..27cf4d6b9 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,6 +25,7 @@ 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; @@ -35,6 +36,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.block.BlockTypeUtil; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; @@ -100,23 +102,22 @@ 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(BlockVector3.at(x, y, z)).getBlockType().getMaterial().isMovementBlocker()) { + if (!world.getBlock(mutablePos.setComponents(x, y, z)).getBlockType().getMaterial().isMovementBlocker()) { ++free; } else { free = 0; } if (free == 2) { - if (y - 1 != origY) { - setPosition(Vector3.at(x + 0.5, y - 2 + 1, z + 0.5)); - } - + 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))); 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 8a1de54ad..4bdd72c74 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,9 +332,7 @@ 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()); @@ -361,8 +359,7 @@ public class PlatformManager { return; } } - - Tool tool = session.getTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); + Tool tool = session.getTool(player); if (tool instanceof DoubleActionBlockTool) { if (tool.canUse(player)) { FawePlayer fp = FawePlayer.wrap(player); @@ -385,7 +382,6 @@ 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), @@ -404,7 +400,7 @@ public class PlatformManager { return; } - Tool tool = session.getTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); + Tool tool = session.getTool(player); if (tool instanceof BlockTool) { if (tool.canUse(player)) { FawePlayer fp = FawePlayer.wrap(player); @@ -475,7 +471,7 @@ public class PlatformManager { return; } - Tool tool = session.getTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); + Tool tool = session.getTool(player); if (tool instanceof DoubleActionTraceTool) { if (tool.canUse(player)) { FawePlayer fp = FawePlayer.wrap(player); @@ -502,7 +498,7 @@ public class PlatformManager { return; } - Tool tool = session.getTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); + Tool tool = session.getTool(player); 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 8a8e71166..be54386b0 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 ba6fd0abd..5a8f771f8 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,6 +19,9 @@ 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 57c6bf390..b92caaa5f 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,10 +22,12 @@ package com.sk89q.worldedit.extent; import static com.google.common.base.Preconditions.checkNotNull; import com.sk89q.worldedit.WorldEditException; -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.BlockState; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.math.BlockVector3; 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 6994442fe..aeaf07e85 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 3997f28c7..00e52e902 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,6 +29,7 @@ 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 a2277f5a5..e759af00a 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,19 +31,30 @@ 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.world.biome.BiomeTypes; +import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.entity.EntityType; @@ -56,11 +67,13 @@ 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; @@ -97,7 +110,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; @@ -119,8 +132,8 @@ public class SpongeSchematicReader extends NBTSchematicReader { return fc = new MemoryOptimizedClipboard(size, 1, 1); } } - - private BlockArrayClipboard readVersion1(UUID uuid) throws IOException { + + private Clipboard 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); @@ -163,33 +176,39 @@ public class SpongeSchematicReader extends NBTSchematicReader { } } }); - streamer.addReader("Schematic.TileEntities.#", (BiConsumer) (index, value) -> { - if (fc == null) { - setupClipboard(0, uuid); + 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); } - 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.#", (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.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.readFully(); @@ -216,7 +235,6 @@ public class SpongeSchematicReader extends NBTSchematicReader { } } } - } if (biomesOut.getSize() != 0) { try (FaweInputStream fis = new FaweInputStream(new LZ4BlockInputStream(new FastByteArraysInputStream(biomesOut.toByteArrays())))) { @@ -231,6 +249,7 @@ 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 88c344566..ede6aaaac 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,6 +20,7 @@ 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 ad75ed911..791b46495 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,6 +26,8 @@ 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; @@ -35,7 +37,13 @@ public class SignCompatibilityHandler implements NBTCompatibilityHandler { @Override public > boolean isAffectedBlock(B block) { - return block.getBlockType() == BlockTypes.SIGN || block.getBlockType() == BlockTypes.WALL_SIGN; + switch (block.getBlockType().getInternalId()) { + case BlockID.SIGN: + case BlockID.WALL_SIGN: + return true; + default: + return false; + } } @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 34f7f668d..fb7d038e4 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,6 +19,7 @@ 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; @@ -26,18 +27,23 @@ 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 javax.annotation.Nullable; +import static com.google.common.base.Preconditions.checkNotNull; /** * Applies a {@link BlockBag} to operations. */ public class BlockBagExtent extends AbstractDelegateExtent { - private Map missingBlocks = new HashMap<>(); + private final boolean mine; + private int[] missingBlocks = new int[BlockTypes.size()]; private BlockBag blockBag; /** @@ -46,9 +52,15 @@ public class BlockBagExtent extends AbstractDelegateExtent { * @param extent the extent * @param blockBag the block bag */ - public BlockBagExtent(Extent extent, @Nullable BlockBag blockBag) { + public BlockBagExtent(Extent extent, @Nonnull BlockBag blockBag) { + this(extent, blockBag, false); + } + + public BlockBagExtent(Extent extent, @Nonnull BlockBag blockBag, boolean mine) { super(extent); + checkNotNull(blockBag); this.blockBag = blockBag; + this.mine = mine; } /** @@ -76,9 +88,15 @@ public class BlockBagExtent extends AbstractDelegateExtent { * @return a map of missing blocks */ public Map popMissing() { - Map missingBlocks = this.missingBlocks; - this.missingBlocks = new HashMap<>(); - return missingBlocks; + 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; } @Override @@ -96,21 +114,19 @@ public class BlockBagExtent extends AbstractDelegateExtent { try { blockBag.fetchPlacedBlock(block.toImmutableState()); } catch (UnplaceableBlockException e) { - return false; + throw new FaweException.FaweBlockBagException(); } catch (BlockBagException e) { - if (!missingBlocks.containsKey(block.getBlockType())) { - missingBlocks.put(block.getBlockType(), 1); - } else { - missingBlocks.put(block.getBlockType(), missingBlocks.get(block.getBlockType()) + 1); - } - return false; + missingBlocks[block.getBlockType().getInternalId()]++; + throw new FaweException.FaweBlockBagException(); } } + 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 3e1a7d4fa..1d4fe4d8d 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 626f050af..0958c1341 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,10 +54,6 @@ 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; @@ -411,11 +407,6 @@ public class BlockTransformExtent extends ResettableExtent { return super.setExtent(extent); } - /** - * Get the transform. - * - * @return the transform - */ public Transform getTransform() { return transform; } @@ -505,36 +496,6 @@ 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 8108353e4..d935716c2 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,6 +28,8 @@ 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 e8ae233dd..eec8a1ed3 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 1e5c62873..8fb81e669 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,9 +19,13 @@ package com.sk89q.worldedit.function.block; -import static com.google.common.base.Preconditions.checkNotNull; - +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 com.sk89q.worldedit.world.block.BlockState; import com.sk89q.jnbt.CompoundTagBuilder; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -32,6 +36,8 @@ 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; /** @@ -48,11 +54,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); @@ -69,13 +75,11 @@ 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 - block = transformNbtData(block); - + BaseBlock block = transformNbtData(source.getFullBlock(position)); return destination.setBlock(transformed.add(to), block); } @@ -114,4 +118,6 @@ 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 f2dff8ae2..30f55258a 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.getDefaultState()); + editSession.setBlock(position, BlockTypes.GRASS_BLOCK); break; case 1: case 2: case 3: - editSession.setBlock(position, BlockTypes.DIRT.getDefaultState()); + editSession.setBlock(position, BlockTypes.DIRT); break; default: - editSession.setBlock(position, BlockTypes.STONE.getDefaultState()); + editSession.setBlock(position, BlockTypes.STONE); } } 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 bbe8c96cc..643f4593e 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,7 +111,6 @@ 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; @@ -136,7 +135,6 @@ 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 602c07f56..ef97efcae 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(new BlockPattern(BlockTypes.DEAD_BUSH.getDefaultState()), 30); - pattern.add(new BlockPattern(BlockTypes.CACTUS.getDefaultState()), 20); - pattern.add(new BlockPattern(BlockTypes.AIR.getDefaultState()), 300); + pattern.add((BlockTypes.DEAD_BUSH.getDefaultState()), 30); + pattern.add((BlockTypes.CACTUS.getDefaultState()), 20); + pattern.add((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(new BlockPattern(BlockTypes.GRASS.getDefaultState()), 300); - pattern.add(new BlockPattern(BlockTypes.POPPY.getDefaultState()), 5); - pattern.add(new BlockPattern(BlockTypes.DANDELION.getDefaultState()), 5); + pattern.add((BlockTypes.GRASS.getDefaultState()), 300); + pattern.add((BlockTypes.POPPY.getDefaultState()), 5); + pattern.add((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 9b44d7e43..ea2c71a96 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,23 +53,26 @@ public class ForestGenerator implements RegionFunction { public boolean apply(BlockVector3 position) throws WorldEditException { BlockState block = editSession.getBlock(position); BlockType t = block.getBlockType(); - - 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; + 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; } } } 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 0d31760af..da52bb416 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; - BlockState log = BlockTypes.OAK_LOG.getDefaultState(); + BlockStateHolder log = BlockTypes.OAK_LOG.getDefaultState(); switch (t) { case 0: @@ -167,7 +167,7 @@ public class GardenPatchGenerator implements RegionFunction { return false; } - BlockState leavesBlock = BlockTypes.OAK_LEAVES.getDefaultState(); + BlockStateHolder 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 new BlockPattern(BlockTypes.PUMPKIN.getDefaultState()); + return BlockTypes.PUMPKIN.getDefaultState(); } /** @@ -208,6 +208,6 @@ public class GardenPatchGenerator implements RegionFunction { * @return a melon pattern */ public static Pattern getMelonPattern() { - return new BlockPattern(BlockTypes.MELON.getDefaultState()); + return (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 e7f919474..1e5a2e8e3 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,45 +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.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.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 com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.extent.Extent; +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.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. @@ -52,23 +38,17 @@ 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); - checkNotNull(blocks); + MainUtil.warnDeprecated(BlockMaskBuilder.class); this.bitSets = new BlockMaskBuilder().addBlocks(blocks).optimize().getBits(); } @Deprecated public BlockMask(Extent extent, BaseBlock... blocks) { super(extent); - checkNotNull(blocks); + MainUtil.warnDeprecated(BlockMaskBuilder.class); this.bitSets = new BlockMaskBuilder().addBlocks(blocks).optimize().getBits(); } @@ -77,12 +57,6 @@ 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; @@ -143,7 +117,6 @@ 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; @@ -260,7 +233,7 @@ public class BlockMask extends AbstractExtentMask { @Override public boolean test(BlockVector3 vector) { - BlockState block = getExtent().getBlock(vector); + BlockStateHolder block = getExtent().getBlock(vector); long[] bitSet = bitSets[block.getInternalBlockTypeId()]; if (bitSet == null) return false; if (bitSet.length == 0) return true; @@ -273,4 +246,5 @@ 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 f08be8f63..844f319a7 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,19 +19,12 @@ 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.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 java.util.*; import static com.google.common.base.Preconditions.checkNotNull; @@ -120,7 +113,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) { @@ -184,7 +177,6 @@ public class MaskIntersection extends AbstractMask { return false; } } - return true; } @@ -202,5 +194,4 @@ 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 dbeb2bc87..a3ac57a03 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 java.util.function.Function; +import javax.annotation.Nullable; /** * 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 09986950a..d51436598 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,35 +1,17 @@ -/* - * 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.

@@ -171,7 +153,7 @@ public class AffineTransform implements Transform, Serializable { * * @return the determinant of the transform. */ - private double determinant() { + public double determinant() { return m00 * (m11 * m22 - m12 * m21) - m01 * (m10 * m22 - m20 * m12) + m02 * (m10 * m21 - m20 * m11); } @@ -320,10 +302,13 @@ public class AffineTransform implements Transform, Serializable { @Override public Vector3 apply(Vector3 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); + 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; } public AffineTransform combine(AffineTransform other) { @@ -334,8 +319,7 @@ public class AffineTransform implements Transform, Serializable { public Transform combine(Transform other) { if (other instanceof Identity || other.isIdentity()) { return this; - } - if (other instanceof AffineTransform) { + } else if (other instanceof AffineTransform) { return concatenate((AffineTransform) other); } else { return new CombinedTransform(this, other); @@ -352,4 +336,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 b95d800a7..e97e7ebf6 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,13 +19,10 @@ package com.sk89q.worldedit.scripting; -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.*; +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.command.InsufficientArgumentsException; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.input.ParserContext; @@ -59,7 +56,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() { @@ -74,7 +71,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Get the player. - * + * * @return the calling player */ public Player getPlayer() { @@ -83,7 +80,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Get the player's session. - * + * * @return a session */ public LocalSession getSession() { @@ -92,7 +89,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Get the configuration for WorldEdit. - * + * * @return the configuration */ public LocalConfiguration getConfiguration() { @@ -101,7 +98,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() { @@ -110,7 +107,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Print a regular message to the user. - * + * * @param message a message */ public void print(String message) { @@ -119,7 +116,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Print an error message to the user. - * + * * @param message a message */ public void error(String message) { @@ -128,7 +125,7 @@ public class CraftScriptContext extends CraftScriptEnvironment { /** * Print an raw message to the user. - * + * * @param message a message */ public void printRaw(String message) { @@ -187,8 +184,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(); @@ -204,8 +201,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(); @@ -222,15 +219,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); @@ -243,15 +240,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 afab20c3a..bf64e4e12 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,14 +19,6 @@ 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; @@ -38,6 +30,14 @@ 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 7500d5afa..de1896397 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,5 +1,7 @@ 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; @@ -8,6 +10,13 @@ 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 1bd6f8cf0..cc5b4be68 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,5 +154,4 @@ 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 0cfbdcd13..fa27b3d17 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,6 +19,7 @@ package com.sk89q.worldedit.world; +import com.sk89q.worldedit.*; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; @@ -34,6 +35,7 @@ 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; @@ -52,7 +54,7 @@ public class NullWorld extends AbstractWorld { private static final NullWorld INSTANCE = new NullWorld(); - protected NullWorld() { + public 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 425a97b81..aeecbcd09 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,15 +830,16 @@ 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 @@ -865,7 +866,9 @@ public final class BlockTypes { try { Field field = BlockTypes.class.getDeclaredField(enumName); ReflectionUtils.setFailsafeFieldValue(field, null, existing); - } catch (NoSuchFieldException | IllegalAccessException e) { + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { e.printStackTrace(); } @@ -895,12 +898,12 @@ public final class BlockTypes { try { BlockStateHolder block = LegacyMapper.getInstance().getBlockFromLegacy(input); if (block != null) return block.getBlockType(); - } catch (NumberFormatException | IndexOutOfBoundsException ignored) { + } catch (NumberFormatException | IndexOutOfBoundsException e) { } throw new SuggestInputParseException("Does not match a valid block type: " + inputLower, inputLower, () -> Stream.of(BlockTypes.values) .filter(b -> StringMan.blockStateMatches(inputLower, b.getId())) - .map(BlockType::getId) + .map(e1 -> e1.getId()) .sorted(StringMan.blockStateComparator(inputLower)) .collect(Collectors.toList()) ); @@ -910,31 +913,31 @@ public final class BlockTypes { return $NAMESPACES; } - public static @Nullable BlockType get(final String id) { + public static final @Nullable BlockType get(final String id) { return $REGISTRY.get(id); } - public static @Nullable BlockType get(final CharSequence id) { + public static final @Nullable BlockType get(final CharSequence id) { return $REGISTRY.get(id); } @Deprecated - public static BlockType get(final int ordinal) { + public static final BlockType get(final int ordinal) { return values[ordinal]; } @Deprecated - public static BlockType getFromStateId(final int internalStateId) { + public static final BlockType getFromStateId(final int internalStateId) { return values[internalStateId & BIT_MASK]; } @Deprecated - public static BlockType getFromStateOrdinal(final int internalStateOrdinal) { + public static final 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 16880af4a..58f7cb8e9 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,9 +28,10 @@ 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; @@ -47,8 +48,11 @@ 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); @@ -222,7 +226,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 {