From 65c6702d946e200647717f68c4c589638508e4d2 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Tue, 11 Jul 2017 22:37:41 +1000 Subject: [PATCH] Various minor Fixes #620 Fixes VS pattern region restrictions Fix some bukkit 1.7.10 issues tweak debugpaste formatting --- ISSUE_TEMPLATE.md | 16 ++-- .../com/boydti/fawe/bukkit/FaweBukkit.java | 7 +- .../fawe/bukkit/v1_7/BukkitChunk_1_7.java | 74 ++++++++++++++++--- .../fawe/bukkit/v1_7/BukkitQueue17.java | 5 +- .../boydti/fawe/object/MaskedFaweQueue.java | 8 ++ .../worldedit/command/SchematicCommands.java | 2 +- .../transform/BlockTransformExtent.java | 6 +- .../world/registry/BundledBlockData.java | 56 ++++++++++++-- .../com/boydti/fawe/bukkit/favs/Favs.java | 1 - 9 files changed, 139 insertions(+), 36 deletions(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index f767200f..d764dddf 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,21 +1,19 @@ -# Bug report template - - +# Bug report + + + **Debug paste link**: **Description of the problem:** - + **How to replicate**: **Checklist**: - + - [] I included a `/fawe debugpaste` link - [] I made sure there aren't duplicates of this report [(Use Search)](https://github.com/boy0001/FastAsyncWorldedit/issues?utf8=%E2%9C%93&q=is%3Aissue) - [] I made sure I am using an up-to-date version of FAWE -- [] I Made sure the bug/error is not caused by any other plugin - - - +- [] I Made sure the bug/error is not caused by any other plugin \ No newline at end of file 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 034c828b..cd4c0321 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java @@ -29,7 +29,6 @@ import com.boydti.fawe.object.FaweQueue; import com.boydti.fawe.regions.FaweMaskManager; import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.ReflectionUtils; -import com.boydti.fawe.util.StringMan; import com.boydti.fawe.util.TaskManager; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.bukkit.EditSessionBlockChangeDelegate; @@ -183,11 +182,11 @@ public class FaweBukkit implements IFawe, Listener { public String getDebugInfo() { StringBuilder msg = new StringBuilder(); List pl = new ArrayList<>(); + msg.append("server.plugins: \n"); for (Plugin p : Bukkit.getPluginManager().getPlugins()) { - pl.add(p.getName()); + msg.append(" - " + p.getName() + ": " + p.getDescription().getVersion() + "\n"); } - msg.append("server.plugins: \n - " + StringMan.join(pl, " - ") + "\n"); - msg.append("server.version: " + Bukkit.getVersion() + " / " + Bukkit.getBukkitVersion()); + msg.append("server.version: " + Bukkit.getVersion() + " / " + Bukkit.getBukkitVersion() + "\n"); return msg.toString(); } diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitChunk_1_7.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitChunk_1_7.java index fdfa56be..fdd9c8fa 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitChunk_1_7.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitChunk_1_7.java @@ -13,6 +13,7 @@ import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.internal.Constants; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -305,8 +306,10 @@ public class BukkitChunk_1_7 extends CharFaweChunk { continue; } sections[j] = section = new ChunkSection(j << 4, flag); + section.setIdArray(null); section.setIdArray(newIdArray); getParent().setCount(0, count - this.getAir(j), section); + section.setDataArray(null); if (newDataArray != null) { section.setDataArray(newDataArray); } @@ -317,26 +320,73 @@ public class BukkitChunk_1_7 extends CharFaweChunk { sections[j] = null; continue; } + section.setIdArray(null); section.setIdArray(newIdArray); getParent().setCount(0, count - this.getAir(j), section); + section.setDataArray(null); if (newDataArray != null) { section.setDataArray(newDataArray); } continue; } + char[] charArray = this.getIdArray(j); byte[] currentIdArray = (byte[]) BukkitQueue17.fieldIds.get(section); NibbleArray currentDataArray = (NibbleArray) BukkitQueue17.fieldData.get(section); boolean data = currentDataArray != null && newDataArray != null; - if (currentDataArray == null && newDataArray != null) { - section.setDataArray(newDataArray); + if (currentDataArray == null) { + byte compactData = (byte) section.getData(0, 0, 0); + if (compactData != 0 && newDataArray == null) { + newDataArray = new NibbleArray(new byte[2048], 4); + byte full = (byte) ((compactData << 4) + compactData); + Arrays.fill(newDataArray.a, full); + for (int i = 0; i < newDataArray.a.length; i++) { + int i2 = i << 1; + int i3 = i2 + 1; + byte val = newDataArray.a[i]; + if (FaweCache.hasData(charArray[i3] >> 4)) { + newDataArray.a[i] = (byte) (val & 15); + } + if (FaweCache.hasData(charArray[i2] >> 4)) { + newDataArray.a[i] = (byte) (val & 240); + } + } + } + else if (newDataArray != null) { + if (compactData != 0) { + byte full = (byte) ((compactData << 4) + compactData); + for (int i = 0; i < newDataArray.a.length; i++) { + int i2 = i << 1; + int i3 = i2 + 1; + byte val = newDataArray.a[i]; + if (charArray[i3] != 0) { + if (charArray[i2] != 0) continue; + newDataArray.a[i] = (byte) (val & 240 | compactData); + continue; + } + if (charArray[i2] != 0) { + if (charArray[i3] != 0) continue; + newDataArray.a[i] = (byte) (val & 15 | (compactData) << 4); + continue; + } + newDataArray.a[i] = full; + } + } + section.setDataArray(null); + section.setDataArray(newDataArray); + } } - if (currentIdArray == null) { - section.setIdArray(newIdArray); - getParent().setCount(0, count - this.getAir(j), section); - continue; + if (currentIdArray == null && newIdArray != null) { + int id = (int) BukkitQueue17.fieldCompactId.get(section); + if (id == 0) { + section.setIdArray(null); + section.setIdArray(newIdArray); + getParent().setCount(0, count - this.getAir(j), section); + continue; + } else { + currentIdArray = section.getIdArray(); + } } int nonEmptyBlockCount = 0; - char[] charArray = this.getIdArray(j); for (int k = 0; k < newIdArray.length; k++) { char combined = charArray[k]; switch (combined) { @@ -360,11 +410,11 @@ public class BukkitChunk_1_7 extends CharFaweChunk { currentIdArray[k] = newIdArray[k]; if (data) { int dataByte = FaweCache.getData(combined); - int x = FaweCache.CACHE_X[0][k]; - int y = FaweCache.CACHE_Y[0][k]; - int z = FaweCache.CACHE_Z[0][k]; - int newData = newDataArray.a(x, y, z); - currentDataArray.a(x, y, z, newData); + if ((k & 1) == 0) { + currentDataArray.a[k] = (byte) (currentDataArray.a[k] & 240 | dataByte); + } else { + currentDataArray.a[k] = (byte) (currentDataArray.a[k] & 15 | (dataByte) << 4); + } } continue; } diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitQueue17.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitQueue17.java index 9cb9cde3..269b28cc 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitQueue17.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitQueue17.java @@ -69,6 +69,7 @@ public class BukkitQueue17 extends BukkitQueue_0 tiles = chunk.tileEntities; - ChunkPosition pos = new ChunkPosition(x, y, z); + ChunkPosition pos = new ChunkPosition(x & 15, y, z & 15); TileEntity tile = tiles.get(pos); return tile != null ? getTag(tile) : null; } diff --git a/core/src/main/java/com/boydti/fawe/object/MaskedFaweQueue.java b/core/src/main/java/com/boydti/fawe/object/MaskedFaweQueue.java index 9320cae5..d1fd16b1 100644 --- a/core/src/main/java/com/boydti/fawe/object/MaskedFaweQueue.java +++ b/core/src/main/java/com/boydti/fawe/object/MaskedFaweQueue.java @@ -39,6 +39,14 @@ public class MaskedFaweQueue extends DelegateFaweQueue { return false; } + @Override + public boolean setBlock(int x, int y, int z, int id, int data, CompoundTag nbt) { + if (WEManager.IMP.maskContains(mask, x, z)) { + return super.setBlock(x, y, z, id, data, nbt); + } + return false; + } + @Override public boolean setBiome(int x, int z, BaseBiome biome) { if (WEManager.IMP.maskContains(mask, x, z)) { diff --git a/core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java b/core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java index d5a7e314..a457981e 100644 --- a/core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java +++ b/core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java @@ -297,7 +297,7 @@ public class SchematicCommands { player.printError("Deletion of " + filename + " failed! Maybe it is read-only."); return; } - BBC.SCHEMATIC_DELETE.send(player, filename); + BBC.FILE_DELETED.send(player, filename); } @Command(aliases = {"formats", "listformats", "f"}, desc = "List available formats", max = 0) diff --git a/core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java b/core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java index 8e6da973..23af7667 100644 --- a/core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java +++ b/core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java @@ -198,7 +198,8 @@ public class BlockTransformExtent extends ResettableExtent { return changedBlock; } - for (State state : states.values()) { + for (Map.Entry entry : states.entrySet()) { + State state = entry.getValue(); if (state.hasDirection()) { StateValue value = state.getValue(block); if (value != null && value.getDirection() != null) { @@ -231,7 +232,8 @@ public class BlockTransformExtent extends ResettableExtent { double closest = -2; boolean found = false; - for (StateValue v : state.valueMap().values()) { + for (Map.Entry entry : state.valueMap().entrySet()) { + StateValue v = entry.getValue(); if (v.getDirection() != null) { double dot = v.getDirection().normalize().dot(newDirection); if (dot >= closest) { diff --git a/core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java b/core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java index af2e8006..98c4d85c 100644 --- a/core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java +++ b/core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java @@ -33,6 +33,9 @@ import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BlockMaterial; +import com.sk89q.worldedit.extent.transform.BlockTransformExtent; +import com.sk89q.worldedit.math.transform.AffineTransform; +import java.io.File; import java.io.IOException; import java.lang.reflect.Type; import java.net.URL; @@ -168,15 +171,37 @@ public class BundledBlockData { return true; } for (Map.Entry stateEntry : entry.states.entrySet()) { - for (Map.Entry valueEntry : stateEntry.getValue().valueMap().entrySet()) { + FaweState faweState = stateEntry.getValue(); + for (Map.Entry valueEntry : faweState.valueMap().entrySet()) { String key = valueEntry.getKey(); + FaweStateValue faweStateValue = valueEntry.getValue(); if (key.equals("true")) { key = stateEntry.getKey(); } - stateMap.put(entry.id + ":" + key, FaweCache.getBlock(entry.legacyId, valueEntry.getValue().data)); - stateMap.put(id + ":" + key, FaweCache.getBlock(entry.legacyId, valueEntry.getValue().data)); - stateMap.putIfAbsent(modId + ":" + key, FaweCache.getBlock(entry.legacyId, valueEntry.getValue().data)); - stateMap.putIfAbsent(key, FaweCache.getBlock(entry.legacyId, valueEntry.getValue().data)); + stateMap.put(entry.id + ":" + key, FaweCache.getBlock(entry.legacyId, faweStateValue.data)); + stateMap.put(id + ":" + key, FaweCache.getBlock(entry.legacyId, faweStateValue.data)); + stateMap.putIfAbsent(modId + ":" + key, FaweCache.getBlock(entry.legacyId, faweStateValue.data)); + stateMap.putIfAbsent(key, FaweCache.getBlock(entry.legacyId, faweStateValue.data)); + } + } + if (!entry.states.isEmpty()) { // Fix vine direction 2 + String[] states = new String[] {"north", "east", "south", "west", "up", "down"}; + Vector[] dirs = new Vector[] { + new Vector(0, 0, -1), + new Vector(1, 0, 0), + new Vector(0, 0, 1), + new Vector(-1, 0, 0), + new Vector(0, 1, 0), + new Vector(0, -1, 0), + }; + for (int i = 0; i < states.length; i++) { + FaweState state = entry.states.get(states[i]); + if (state != null && !state.hasDirection()) { + FaweStateValue active = state.valueMap().get("true"); + if (active != null) { + entry.fixDirection(dirs[i], states[i], null, active.data); + } + } } } FaweState half = entry.states.get("half"); @@ -370,8 +395,27 @@ public class BundledBlockData { state.postDeserialization(); } } + + protected void fixDirection(Vector direction, String key, Byte mask, int data) { + FaweState state = states.remove(key); + if (state != null && !state.hasDirection()) { + FaweState facing = states.get("facing"); + if (facing == null) { + facing = BundledBlockData.getInstance().new FaweState(); + facing.values = new HashMap<>(); + states.put("facing", facing); + } + if (mask != null) facing.dataMask = (byte) (facing.getDataMask() | mask); + FaweStateValue value = BundledBlockData.getInstance().new FaweStateValue(); + value.state = facing; + value.data = (byte) data; + value.direction = direction; + facing.values.put(key, value); + } + } } + public static Class inject() { return BundledBlockData.class; } @@ -414,7 +458,7 @@ public class BundledBlockData { @Override public boolean isSet(BaseBlock block) { - return data != null && (block.getData() & state.getDataMask()) == data; + return data != null && ((state.dataMask == null && block.getData() == data) || (block.getData() & state.getDataMask()) == data); } @Override diff --git a/favs/src/main/java/com/boydti/fawe/bukkit/favs/Favs.java b/favs/src/main/java/com/boydti/fawe/bukkit/favs/Favs.java index 2283817b..afcbbfd5 100644 --- a/favs/src/main/java/com/boydti/fawe/bukkit/favs/Favs.java +++ b/favs/src/main/java/com/boydti/fawe/bukkit/favs/Favs.java @@ -35,7 +35,6 @@ public class Favs extends JavaPlugin { String name = file.getName().toLowerCase(); if (name.endsWith(".jar") && name.contains("voxelsniper") && !name.contains("fastasyncvoxelsniper")) { output = file; - System.out.println("File " + file + " | " + thisName); break; } }