diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java index a9b59a08..fde24497 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java @@ -390,6 +390,20 @@ public class FaweBukkit implements IFawe, Listener { } return managers; } +// +// @EventHandler +// public void onWorldLoad(WorldLoadEvent event) { +// org.bukkit.World world = event.getWorld(); +// world.setKeepSpawnInMemory(false); +// WorldServer nmsWorld = ((CraftWorld) world).getHandle(); +// ChunkProviderServer provider = nmsWorld.getChunkProviderServer(); +// try { +// Field fieldChunkLoader = provider.getClass().getDeclaredField("chunkLoader"); +// ReflectionUtils.setFailsafeFieldValue(fieldChunkLoader, provider, new FaweChunkLoader()); +// } catch (Throwable e) { +// e.printStackTrace(); +// } +// } @EventHandler public void onChunkLoad(ChunkLoadEvent event) { diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitChunk_1_10.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitChunk_1_10.java index 111cefa5..8b0349ce 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitChunk_1_10.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitChunk_1_10.java @@ -353,7 +353,7 @@ public class BukkitChunk_1_10 extends CharFaweChunk { toRemove = new HashMap<>(); } if (copy != null) { - storeTile(tile.getValue(), tile.getKey()); + copy.storeTile(tile.getValue(), tile.getKey()); } toRemove.put(tile.getKey(), tile.getValue()); } diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/BukkitChunk_1_11.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/BukkitChunk_1_11.java index 7fd3d9c5..f9f713a4 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/BukkitChunk_1_11.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/BukkitChunk_1_11.java @@ -363,7 +363,7 @@ public class BukkitChunk_1_11 extends CharFaweChunk(); } if (copy != null) { - storeTile(tile.getValue(), tile.getKey()); + copy.storeTile(tile.getValue(), tile.getKey()); } toRemove.put(tile.getKey(), tile.getValue()); } diff --git a/core/src/main/java/com/boydti/fawe/FaweAPI.java b/core/src/main/java/com/boydti/fawe/FaweAPI.java index d89c6acb..6bfd7787 100644 --- a/core/src/main/java/com/boydti/fawe/FaweAPI.java +++ b/core/src/main/java/com/boydti/fawe/FaweAPI.java @@ -17,6 +17,7 @@ import com.boydti.fawe.util.EditSessionBuilder; import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.MemUtil; import com.boydti.fawe.util.SetQueue; +import com.boydti.fawe.util.StringMan; import com.boydti.fawe.util.TaskManager; import com.boydti.fawe.util.WEManager; import com.boydti.fawe.wrappers.WorldWrapper; @@ -211,9 +212,10 @@ public class FaweAPI { } /** - * If you just need things to look random, use this faster alternative - * @return PseudoRandom + * Use ThreadLocalRandom instead + * @return */ + @Deprecated public static PseudoRandom getFastRandom() { return new PseudoRandom(); } diff --git a/core/src/main/java/com/boydti/fawe/command/AnvilCommands.java b/core/src/main/java/com/boydti/fawe/command/AnvilCommands.java index 8feef479..d1f7ec6f 100644 --- a/core/src/main/java/com/boydti/fawe/command/AnvilCommands.java +++ b/core/src/main/java/com/boydti/fawe/command/AnvilCommands.java @@ -133,7 +133,7 @@ public class AnvilCommands { try { byte[] bytes = mca.getChunkCompressedBytes(offset); if (bytes == null) return; - Runnable task = new Runnable() { + Runnable task = new Runnable() { @Override public void run() { try { diff --git a/core/src/main/java/com/boydti/fawe/jnbt/anvil/HeightMapMCAGenerator.java b/core/src/main/java/com/boydti/fawe/jnbt/anvil/HeightMapMCAGenerator.java index 67ca987e..025fd6e9 100644 --- a/core/src/main/java/com/boydti/fawe/jnbt/anvil/HeightMapMCAGenerator.java +++ b/core/src/main/java/com/boydti/fawe/jnbt/anvil/HeightMapMCAGenerator.java @@ -150,18 +150,6 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent { return true; } - private char get(char[][][] map, int x, int y, int z) { - char[][] yMap = map[y]; - if (yMap == null) { - return 0; - } - char[] zMap = yMap[z & 15]; - if (zMap == null) { - return 0; - } - return zMap[x & 15]; - } - @Override public BaseBiome getBiome(Vector2D position) { int index = position.getBlockZ() * getWidth() + position.getBlockX(); @@ -247,62 +235,6 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent { } } - private void setOverlay(BufferedImage img, char combined, boolean white) { - if (img.getWidth() != getWidth() || img.getHeight() != getLength()) throw new IllegalArgumentException("Input image dimensions do not match the current height map!"); - if (overlay == null) overlay = new char[getArea()]; - int index = 0; - for (int z = 0; z < getLength(); z++) { - for (int x = 0; x < getWidth(); x++, index++){ - int height = img.getRGB(x, z) & 0xFF; - if (height == 255 || height > 0 && white && PseudoRandom.random.nextInt(256) <= height) { - overlay[index] = combined; - } - } - } - } - - private void setMain(BufferedImage img, char combined, boolean white) { - if (img.getWidth() != getWidth() || img.getHeight() != getLength()) throw new IllegalArgumentException("Input image dimensions do not match the current height map!"); - modifiedMain = true; - int index = 0; - for (int z = 0; z < getLength(); z++) { - for (int x = 0; x < getWidth(); x++, index++){ - int height = img.getRGB(x, z) & 0xFF; - if (height == 255 || height > 0 && white && PseudoRandom.random.nextInt(256) <= height) { - main[index] = combined; - } - } - } - } - - private void setFloor(BufferedImage img, char combined, boolean white) { - if (img.getWidth() != getWidth() || img.getHeight() != getLength()) throw new IllegalArgumentException("Input image dimensions do not match the current height map!"); - int index = 0; - for (int z = 0; z < getLength(); z++) { - for (int x = 0; x < getWidth(); x++, index++){ - int height = img.getRGB(x, z) & 0xFF; - if (height == 255 || height > 0 && white && PseudoRandom.random.nextInt(256) <= height) { - floor[index] = combined; - } - } - } - } - - private void setColumn(BufferedImage img, char combined, boolean white) { - if (img.getWidth() != getWidth() || img.getHeight() != getLength()) throw new IllegalArgumentException("Input image dimensions do not match the current height map!"); - modifiedMain = true; - int index = 0; - for (int z = 0; z < getLength(); z++) { - for (int x = 0; x < getWidth(); x++, index++){ - int height = img.getRGB(x, z) & 0xFF; - if (height == 255 || height > 0 && white && PseudoRandom.random.nextInt(256) <= height) { - main[index] = combined; - floor[index] = combined; - } - } - } - } - public void setBiome(Mask mask, byte biome) { int index = 0; for (int z = 0; z < getLength(); z++) { @@ -318,70 +250,6 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent { } } - private void setOverlay(Mask mask, char combined) { - int index = 0; - if (overlay == null) overlay = new char[getArea()]; - for (int z = 0; z < getLength(); z++) { - mutable.mutZ(z); - for (int x = 0; x < getWidth(); x++, index++){ - int y = heights[index] & 0xFF; - mutable.mutX(x); - mutable.mutY(y); - if (mask.test(mutable)) { - overlay[index] = combined; - } - } - } - } - - private void setFloor(Mask mask, char combined) { - int index = 0; - for (int z = 0; z < getLength(); z++) { - mutable.mutZ(z); - for (int x = 0; x < getWidth(); x++, index++){ - int y = heights[index] & 0xFF; - mutable.mutX(x); - mutable.mutY(y); - if (mask.test(mutable)) { - floor[index] = combined; - } - } - } - } - - private void setMain(Mask mask, char combined) { - modifiedMain = true; - int index = 0; - for (int z = 0; z < getLength(); z++) { - mutable.mutZ(z); - for (int x = 0; x < getWidth(); x++, index++){ - int y = heights[index] & 0xFF; - mutable.mutX(x); - mutable.mutY(y); - if (mask.test(mutable)) { - main[index] = combined; - } - } - } - } - - private void setColumn(Mask mask, char combined) { - modifiedMain = true; - int index = 0; - for (int z = 0; z < getLength(); z++) { - mutable.mutZ(z); - for (int x = 0; x < getWidth(); x++, index++){ - int y = heights[index] & 0xFF; - mutable.mutX(x); - mutable.mutY(y); - if (mask.test(mutable)) { - floor[index] = combined; - main[index] = combined; - } - } - } - } - public void setOverlay(BufferedImage img, Pattern pattern, boolean white) { if (pattern instanceof BlockPattern) { setOverlay(img, (char) ((BlockPattern) pattern).getBlock().getCombined(), white); @@ -552,25 +420,6 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent { Arrays.fill(biomes, (byte) biome); } - private void setFloor(int value) { - Arrays.fill(floor, (char) value); - } - - private void setColumn(int value) { - setFloor(value); - setMain(value); - } - - private void setMain(int value) { - modifiedMain = true; - Arrays.fill(main, (char) value); - } - - private void setOverlay(int value) { - if (overlay == null) overlay = new char[getArea()]; - Arrays.fill(overlay, (char) value); - } - public void setFloor(Pattern value) { if (value instanceof BlockPattern) { setFloor(((BlockPattern) value).getBlock().getCombined()); @@ -836,4 +685,155 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent { } return chunk; } + + private char get(char[][][] map, int x, int y, int z) { + char[][] yMap = map[y]; + if (yMap == null) { + return 0; + } + char[] zMap = yMap[z & 15]; + if (zMap == null) { + return 0; + } + return zMap[x & 15]; + } + + private void setOverlay(Mask mask, char combined) { + int index = 0; + if (overlay == null) overlay = new char[getArea()]; + for (int z = 0; z < getLength(); z++) { + mutable.mutZ(z); + for (int x = 0; x < getWidth(); x++, index++){ + int y = heights[index] & 0xFF; + mutable.mutX(x); + mutable.mutY(y); + if (mask.test(mutable)) { + overlay[index] = combined; + } + } + } + } + + private void setFloor(Mask mask, char combined) { + int index = 0; + for (int z = 0; z < getLength(); z++) { + mutable.mutZ(z); + for (int x = 0; x < getWidth(); x++, index++){ + int y = heights[index] & 0xFF; + mutable.mutX(x); + mutable.mutY(y); + if (mask.test(mutable)) { + floor[index] = combined; + } + } + } + } + + private void setMain(Mask mask, char combined) { + modifiedMain = true; + int index = 0; + for (int z = 0; z < getLength(); z++) { + mutable.mutZ(z); + for (int x = 0; x < getWidth(); x++, index++){ + int y = heights[index] & 0xFF; + mutable.mutX(x); + mutable.mutY(y); + if (mask.test(mutable)) { + main[index] = combined; + } + } + } + } + + private void setColumn(Mask mask, char combined) { + modifiedMain = true; + int index = 0; + for (int z = 0; z < getLength(); z++) { + mutable.mutZ(z); + for (int x = 0; x < getWidth(); x++, index++){ + int y = heights[index] & 0xFF; + mutable.mutX(x); + mutable.mutY(y); + if (mask.test(mutable)) { + floor[index] = combined; + main[index] = combined; + } + } + } + } + + private void setFloor(int value) { + Arrays.fill(floor, (char) value); + } + + private void setColumn(int value) { + setFloor(value); + setMain(value); + } + + private void setMain(int value) { + modifiedMain = true; + Arrays.fill(main, (char) value); + } + + private void setOverlay(int value) { + if (overlay == null) overlay = new char[getArea()]; + Arrays.fill(overlay, (char) value); + } + + private void setOverlay(BufferedImage img, char combined, boolean white) { + if (img.getWidth() != getWidth() || img.getHeight() != getLength()) throw new IllegalArgumentException("Input image dimensions do not match the current height map!"); + if (overlay == null) overlay = new char[getArea()]; + int index = 0; + for (int z = 0; z < getLength(); z++) { + for (int x = 0; x < getWidth(); x++, index++){ + int height = img.getRGB(x, z) & 0xFF; + if (height == 255 || height > 0 && white && PseudoRandom.random.nextInt(256) <= height) { + overlay[index] = combined; + } + } + } + } + + private void setMain(BufferedImage img, char combined, boolean white) { + if (img.getWidth() != getWidth() || img.getHeight() != getLength()) throw new IllegalArgumentException("Input image dimensions do not match the current height map!"); + modifiedMain = true; + int index = 0; + for (int z = 0; z < getLength(); z++) { + for (int x = 0; x < getWidth(); x++, index++){ + int height = img.getRGB(x, z) & 0xFF; + if (height == 255 || height > 0 && white && PseudoRandom.random.nextInt(256) <= height) { + main[index] = combined; + } + } + } + } + + private void setFloor(BufferedImage img, char combined, boolean white) { + if (img.getWidth() != getWidth() || img.getHeight() != getLength()) throw new IllegalArgumentException("Input image dimensions do not match the current height map!"); + int index = 0; + for (int z = 0; z < getLength(); z++) { + for (int x = 0; x < getWidth(); x++, index++){ + int height = img.getRGB(x, z) & 0xFF; + if (height == 255 || height > 0 && white && PseudoRandom.random.nextInt(256) <= height) { + floor[index] = combined; + } + } + } + } + + private void setColumn(BufferedImage img, char combined, boolean white) { + if (img.getWidth() != getWidth() || img.getHeight() != getLength()) throw new IllegalArgumentException("Input image dimensions do not match the current height map!"); + modifiedMain = true; + int index = 0; + for (int z = 0; z < getLength(); z++) { + for (int x = 0; x < getWidth(); x++, index++){ + int height = img.getRGB(x, z) & 0xFF; + if (height == 255 || height > 0 && white && PseudoRandom.random.nextInt(256) <= height) { + main[index] = combined; + floor[index] = combined; + } + } + } + } } diff --git a/core/src/main/java/com/boydti/fawe/object/FaweInputStream.java b/core/src/main/java/com/boydti/fawe/object/FaweInputStream.java index 82cff181..b16dc4f6 100644 --- a/core/src/main/java/com/boydti/fawe/object/FaweInputStream.java +++ b/core/src/main/java/com/boydti/fawe/object/FaweInputStream.java @@ -2,14 +2,16 @@ package com.boydti.fawe.object; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NamedTag; +import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; -public class FaweInputStream extends InputStream { +public class FaweInputStream extends DataInputStream { private final InputStream parent; public FaweInputStream(InputStream parent) { + super(parent); this.parent = parent; } @@ -17,49 +19,6 @@ public class FaweInputStream extends InputStream { return parent; } - @Override - public int read() throws IOException { - return parent.read(); - } - - public long readLong() throws IOException { - return (long) - (read() << 64) + - (read() << 56) + - (read() << 48) + - (read() << 36) + - (read() << 24) + - (read() << 16) + - (read() << 8) + - (read()); - } - - public int readInt() throws IOException { - return (int) - (read() << 24) + - (read() << 16) + - (read() << 8) + - (read()); - } - - public short readShort() throws IOException { - return (short) ( - (read() << 8) + - read()); - } - - public byte readByte() throws IOException { - return (byte) read(); - } - - public int readUnsignedByte() throws IOException { - return read(); - } - - public int readUnsignedShort() throws IOException { - return (int) readShort() & 0xFFFF; - } - public int readMedium() throws IOException { return (int) ( (read() << 16) + diff --git a/core/src/main/java/com/boydti/fawe/object/FaweOutputStream.java b/core/src/main/java/com/boydti/fawe/object/FaweOutputStream.java index faf5868a..d2923dcb 100644 --- a/core/src/main/java/com/boydti/fawe/object/FaweOutputStream.java +++ b/core/src/main/java/com/boydti/fawe/object/FaweOutputStream.java @@ -2,14 +2,16 @@ package com.boydti.fawe.object; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.Tag; +import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; -public class FaweOutputStream extends OutputStream { +public class FaweOutputStream extends DataOutputStream { private final OutputStream parent; public FaweOutputStream(OutputStream parent) { + super(parent); this.parent = parent; } @@ -17,35 +19,12 @@ public class FaweOutputStream extends OutputStream { return parent; } - @Override - public void write(int b) throws IOException { - parent.write(b); - } - public void write(int b, int amount) throws IOException { for (int i = 0; i < amount; i++) { write(b); } } - public void writeLong(long l) throws IOException { - write((byte) (l >>> 64)); - write((byte) (l >>> 56)); - write((byte) (l >>> 48)); - write((byte) (l >>> 36)); - write((byte) (l >>> 24)); - write((byte) (l >>> 16)); - write((byte) (l >>> 8)); - write((byte) (l)); - } - - public void writeInt(int i) throws IOException { - write((byte) (i >>> 24)); - write((byte) (i >>> 16)); - write((byte) (i >>> 8)); - write((byte) (i)); - } - public void writeShort(short s) throws IOException { write((byte) (s >>> 8)); write((byte) (s)); diff --git a/core/src/main/java/com/boydti/fawe/object/brush/LineBrush.java b/core/src/main/java/com/boydti/fawe/object/brush/LineBrush.java index 9205d400..b7bf7831 100644 --- a/core/src/main/java/com/boydti/fawe/object/brush/LineBrush.java +++ b/core/src/main/java/com/boydti/fawe/object/brush/LineBrush.java @@ -1,5 +1,6 @@ package com.boydti.fawe.object.brush; +import com.boydti.fawe.object.brush.visualization.VisualExtent; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.Vector; @@ -19,12 +20,13 @@ public class LineBrush implements Brush, ResettableTool { @Override public void build(EditSession editSession, Vector position, final Pattern pattern, double size) throws MaxChangedBlocksException { + boolean visual = (editSession.getExtent() instanceof VisualExtent); if (pos1 == null) { - pos1 = position; + if (!visual) pos1 = position; return; } editSession.drawLine(pattern, pos1, position, size, !shell, flat); - if (!select) { + if (!select && !visual) { pos1 = null; return; } diff --git a/core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java b/core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java index 16777be3..10d48b41 100644 --- a/core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java +++ b/core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java @@ -354,21 +354,16 @@ public class PlatformManager { // At this time, only handle interaction from players if (actor instanceof Player) { - final Player player = new LocationMaskedPlayerWrapper(PlayerWrapper.wrap((Player) actor), ((Player) actor).getLocation()); final LocalSession session = worldEdit.getSessionManager().get(actor); - + Player playerActor = (Player) actor; if (event.getType() == Interaction.HIT) { - if (player.getItemInHand() == getConfiguration().wandItem) { - if (!session.isToolControlEnabled()) { + if (session.isToolControlEnabled() && playerActor.getItemInHand() == getConfiguration().wandItem) { + FawePlayer fp = FawePlayer.wrap(playerActor); + if (!fp.hasPermission("worldedit.selection.pos")) { return; } - - if (!actor.hasPermission("worldedit.selection.pos")) { - return; - } - - final RegionSelector selector = session.getRegionSelector(player.getWorld()); - FawePlayer fp = FawePlayer.wrap(player); + final RegionSelector selector = session.getRegionSelector(playerActor.getWorld()); + final Player player = new LocationMaskedPlayerWrapper(PlayerWrapper.wrap((Player) actor), ((Player) actor).getLocation()); fp.runAction(new Runnable() { @Override public void run() { @@ -381,10 +376,11 @@ public class PlatformManager { event.setCancelled(true); return; } - if (player.isHoldingPickAxe() && session.hasSuperPickAxe()) { + if (session.hasSuperPickAxe() && playerActor.isHoldingPickAxe()) { final BlockTool superPickaxe = session.getSuperPickaxe(); - if (superPickaxe != null && superPickaxe.canUse(player)) { - FawePlayer fp = FawePlayer.wrap(player); + if (superPickaxe != null && superPickaxe.canUse(playerActor)) { + FawePlayer fp = FawePlayer.wrap(playerActor); + final Player player = new LocationMaskedPlayerWrapper(PlayerWrapper.wrap((Player) actor), ((Player) actor).getLocation()); fp.runAction(new Runnable() { @Override public void run() { @@ -395,10 +391,11 @@ public class PlatformManager { return; } } - final Tool tool = session.getTool(player); + final Tool tool = session.getTool(playerActor); if (tool != null && tool instanceof DoubleActionBlockTool) { - if (tool.canUse(player)) { - FawePlayer fp = FawePlayer.wrap(player); + if (tool.canUse(playerActor)) { + FawePlayer fp = FawePlayer.wrap(playerActor); + final Player player = new LocationMaskedPlayerWrapper(PlayerWrapper.wrap((Player) actor), ((Player) actor).getLocation()); fp.runAction(new Runnable() { @Override public void run() { @@ -409,16 +406,13 @@ public class PlatformManager { } } } else if (event.getType() == Interaction.OPEN) { - if (player.getItemInHand() == getConfiguration().wandItem) { - if (!session.isToolControlEnabled()) { + if (session.isToolControlEnabled() && playerActor.getItemInHand() == getConfiguration().wandItem) { + FawePlayer fp = FawePlayer.wrap(playerActor); + if (!fp.hasPermission("worldedit.selection.pos")) { return; } - - if (!actor.hasPermission("worldedit.selection.pos")) { - return; - } - final RegionSelector selector = session.getRegionSelector(player.getWorld()); - FawePlayer fp = FawePlayer.wrap(player); + final RegionSelector selector = session.getRegionSelector(playerActor.getWorld()); + final Player player = new LocationMaskedPlayerWrapper(PlayerWrapper.wrap((Player) actor), ((Player) actor).getLocation()); fp.runAction(new Runnable() { @Override public void run() { @@ -432,10 +426,11 @@ public class PlatformManager { return; } - final Tool tool = session.getTool(player); + final Tool tool = session.getTool(playerActor); if (tool != null && tool instanceof BlockTool) { - if (tool.canUse(player)) { - FawePlayer fp = FawePlayer.wrap(player); + if (tool.canUse(playerActor)) { + FawePlayer fp = FawePlayer.wrap(playerActor); + final Player player = new LocationMaskedPlayerWrapper(PlayerWrapper.wrap((Player) actor), ((Player) actor).getLocation()); fp.runAction(new Runnable() { @Override public void run() {