diff --git a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java index 3b4713dcfe..be0203337e 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java @@ -470,7 +470,7 @@ protected > T internalCall( } if (createCopy) { - char[] tmpLoad = loadPrivately(layerNo); + char[] tmpLoad = load(layerNo); char[] copyArr = new char[4096]; System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); copy.storeSection(getSectionIndex, copyArr); @@ -535,7 +535,7 @@ protected > T internalCall( } else if (existingSection != getSections(false)[getSectionIndex]) { this.sections[getSectionIndex] = existingSection; this.reset(); - } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), loadPrivately(layerNo))) { + } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), load(layerNo))) { this.reset(layerNo); /*} else if (lock.isModified()) { this.reset(layerNo);*/ @@ -552,7 +552,7 @@ protected > T internalCall( newSection = PaperweightPlatformAdapter.newChunkSection( layerNo, - this::loadPrivately, + this::load, setArr, adapter, biomeRegistry, @@ -1016,7 +1016,7 @@ public synchronized boolean trim(boolean aggressive) { } else { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); - if (!hasSection(i) || !super.sections[layer].isFull()) { + if (!hasSection(i) || super.blocks[layer] == null) { continue; } LevelChunkSection existing = getSections(true)[layer]; diff --git a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java index 418110067c..b08afe5456 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java @@ -470,7 +470,7 @@ protected > T internalCall( } if (createCopy) { - char[] tmpLoad = loadPrivately(layerNo); + char[] tmpLoad = load(layerNo); char[] copyArr = new char[4096]; System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); copy.storeSection(getSectionIndex, copyArr); @@ -535,7 +535,7 @@ protected > T internalCall( } else if (existingSection != getSections(false)[getSectionIndex]) { this.sections[getSectionIndex] = existingSection; this.reset(); - } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), loadPrivately(layerNo))) { + } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), load(layerNo))) { this.reset(layerNo); /*} else if (lock.isModified()) { this.reset(layerNo);*/ @@ -552,7 +552,7 @@ protected > T internalCall( newSection = PaperweightPlatformAdapter.newChunkSection( layerNo, - this::loadPrivately, + this::load, setArr, adapter, biomeRegistry, @@ -1017,7 +1017,7 @@ public synchronized boolean trim(boolean aggressive) { } else { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); - if (!hasSection(i) || !super.sections[layer].isFull()) { + if (!hasSection(i) || super.blocks[layer] == null) { continue; } LevelChunkSection existing = getSections(true)[layer]; diff --git a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightGetBlocks.java index fe247efb06..a03f3d9475 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightGetBlocks.java @@ -471,7 +471,7 @@ protected > T internalCall( } if (createCopy) { - char[] tmpLoad = loadPrivately(layerNo); + char[] tmpLoad = load(layerNo); char[] copyArr = new char[4096]; System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); copy.storeSection(getSectionIndex, copyArr); @@ -536,7 +536,7 @@ protected > T internalCall( } else if (existingSection != getSections(false)[getSectionIndex]) { this.sections[getSectionIndex] = existingSection; this.reset(); - } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), loadPrivately(layerNo))) { + } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), load(layerNo))) { this.reset(layerNo); /*} else if (lock.isModified()) { this.reset(layerNo);*/ @@ -553,7 +553,7 @@ protected > T internalCall( newSection = PaperweightPlatformAdapter.newChunkSection( layerNo, - this::loadPrivately, + this::load, setArr, adapter, biomeRegistry, @@ -1018,7 +1018,7 @@ public synchronized boolean trim(boolean aggressive) { } else { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); - if (!hasSection(i) || !super.sections[layer].isFull()) { + if (!hasSection(i) || super.blocks[layer] == null) { continue; } LevelChunkSection existing = getSections(true)[layer]; diff --git a/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightGetBlocks.java index 6fe163d281..9fbc1ef64e 100644 --- a/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightGetBlocks.java @@ -471,7 +471,7 @@ protected > T internalCall( } if (createCopy) { - char[] tmpLoad = loadPrivately(layerNo); + char[] tmpLoad = load(layerNo); char[] copyArr = new char[4096]; System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); copy.storeSection(getSectionIndex, copyArr); @@ -534,7 +534,7 @@ protected > T internalCall( } else if (existingSection != getSections(false)[getSectionIndex]) { this.sections[getSectionIndex] = existingSection; this.reset(); - } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), loadPrivately(layerNo))) { + } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), load(layerNo))) { this.reset(layerNo); /*} else if (lock.isModified()) { this.reset(layerNo);*/ @@ -551,7 +551,7 @@ protected > T internalCall( newSection = PaperweightPlatformAdapter.newChunkSection( layerNo, - this::loadPrivately, + this::load, setArr, adapter, biomeRegistry, @@ -1052,7 +1052,7 @@ public synchronized boolean trim(boolean aggressive) { } else { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); - if (!hasSection(i) || !super.sections[layer].isFull()) { + if (!hasSection(i) || super.blocks[layer] == null) { continue; } LevelChunkSection existing = getSections(true)[layer]; diff --git a/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightGetBlocks.java index 78ea5ce2ee..c2bbe67998 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightGetBlocks.java @@ -69,9 +69,7 @@ import org.enginehub.linbus.tree.LinStringTag; import org.enginehub.linbus.tree.LinTagType; -import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.AbstractCollection; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -468,7 +466,7 @@ protected > T internalCall( } if (createCopy) { - char[] tmpLoad = loadPrivately(layerNo); + char[] tmpLoad = load(layerNo); char[] copyArr = new char[4096]; System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); copy.storeSection(getSectionIndex, copyArr); @@ -530,7 +528,7 @@ protected > T internalCall( this.reset(); } else if (!Arrays.equals( update(getSectionIndex, new char[4096], true), - loadPrivately(layerNo) + load(layerNo) )) { this.reset(layerNo); /*} else if (lock.isModified()) { @@ -548,7 +546,7 @@ protected > T internalCall( newSection = PaperweightPlatformAdapter.newChunkSection( layerNo, - this::loadPrivately, + this::load, setArr, adapter, biomeRegistry, @@ -1013,7 +1011,7 @@ public synchronized boolean trim(boolean aggressive) { } else { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); - if (!hasSection(i) || !super.sections[layer].isFull()) { + if (!hasSection(i) || super.blocks[layer] == null) { continue; } LevelChunkSection existing = getSections(true)[layer]; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java index b64d6a893b..5e95261682 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java @@ -354,8 +354,7 @@ public final BlockState getBlockBelow() { } if (layer > minLayer) { final int newLayer = layer - 1; - final CharGetBlocks chunk = this.get; - return states[chunk.sections[newLayer].get(chunk, newLayer, index + 3840)]; + return states[get.get(newLayer, index + 3840)]; } return BlockTypes.__RESERVED__.getDefaultState(); } @@ -367,8 +366,7 @@ public final BlockState getBlockAbove() { } if (layer < maxLayer) { final int newLayer = layer + 1; - final CharGetBlocks chunk = this.get; - return states[chunk.sections[newLayer].get(chunk, newLayer, index - 3840)]; + return states[get.get(newLayer, index - 3840)]; } return BlockTypes.__RESERVED__.getDefaultState(); } @@ -382,7 +380,7 @@ public final BlockState getBlockRelativeY(int y) { } else if ((layerAdd > 0 && layerAdd < (maxLayer - layer)) || (layerAdd < 0 && layerAdd < (minLayer - layer))) { final int newLayer = layer + layerAdd; final int index = (this.index + ((y & 15) << 8)) & 4095; - return states[get.sections[newLayer].get(get, newLayer, index)]; + return states[get.get(newLayer, index)]; } return BlockTypes.__RESERVED__.getDefaultState(); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java index c8de0d99bf..3bbee7978b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java @@ -9,7 +9,6 @@ import org.apache.logging.log4j.Logger; import javax.annotation.Nullable; -import java.lang.invoke.VarHandle; import java.util.Arrays; public abstract class CharBlocks implements IBlocks { @@ -18,61 +17,31 @@ public abstract class CharBlocks implements IBlocks { protected static final Section FULL = new Section() { @Override - public char[] get(CharBlocks blocks, int layer) { - char[] arr = blocks.blocks[layer]; - if (arr == null) { - // Chunk probably trimmed mid-operations, but do nothing about it to avoid other issues - synchronized (blocks.sectionLocks[layer]) { - LOGGER.warn("Unexpected null section, please report this occurence alongside a debugpaste."); - return getSkipFull(blocks, layer, false); - } - } + public char[] get(CharBlocks blocks, int layer, char[] arr) { return arr; } // Ignore aggressive switch here. @Override - public char[] get(CharBlocks blocks, int layer, boolean aggressive) { - char[] arr = blocks.blocks[layer]; - if (arr == null) { - // Chunk probably trimmed mid-operations, but do nothing about it to avoid other issues - synchronized (blocks.sectionLocks[layer]) { - LOGGER.warn("Unexpected null section, please report this occurence alongside a debugpaste."); - return getSkipFull(blocks, layer, aggressive); - } - } + public char[] get(CharBlocks blocks, int layer, char[] arr, boolean aggressive) { return arr; } - - @Override - public boolean isFull() { - return true; - } }; protected static final Section EMPTY = new Section() { @Override - public char[] get(CharBlocks blocks, int layer) { + public char[] get(CharBlocks blocks, int layer, char[] arr) { // Defaults to aggressive as it should only be avoided where we know we've reset a chunk during an edit - return get(blocks, layer, true); + return get(blocks, layer, arr, true); } @Override - public char[] get(CharBlocks blocks, int layer, boolean aggressive) { + public char[] get(CharBlocks blocks, int layer, char[] arr, boolean aggressive) { synchronized (blocks.sectionLocks[layer]) { - if (blocks.sections[layer] == FULL) { - return FULL.get(blocks, layer); - } - return getSkipFull(blocks, layer, aggressive); + return update(blocks, layer, aggressive); } } - - @Override - public boolean isFull() { - return false; - } }; public char[][] blocks; - public Section[] sections; public Object[] sectionLocks; protected int minSectionPosition; protected int maxSectionPosition; @@ -88,10 +57,8 @@ public CharBlocks(int minSectionPosition, int maxSectionPosition) { this.maxSectionPosition = maxSectionPosition; this.sectionCount = maxSectionPosition - minSectionPosition + 1; blocks = new char[sectionCount][]; - sections = new Section[sectionCount]; sectionLocks = new Object[sectionCount]; for (int i = 0; i < sectionCount; i++) { - sections[i] = EMPTY; sectionLocks[i] = new Object(); } } @@ -102,37 +69,30 @@ public void init(int chunkX, int chunkZ) { } @Override - public synchronized boolean trim(boolean aggressive) { - boolean result = true; + public boolean trim(boolean aggressive) { for (int i = 0; i < sectionCount; i++) { - if (!sections[i].isFull() && blocks[i] != null) { - blocks[i] = null; - } else { - result = false; + synchronized (sectionLocks[i]) { + if (blocks[i] != null) { + return false; + } } } - return result; + return true; } @Override public boolean trim(boolean aggressive, int layer) { - boolean result = true; synchronized (sectionLocks[layer]) { - if (!sections[layer].isFull() && blocks[layer] != null) { - blocks[layer] = null; - } else { - result = false; - } + return blocks[layer] == null; } - return result; } @Override - public synchronized IChunkSet reset() { + public IChunkSet reset() { for (int i = 0; i < sectionCount; i++) { - sections[i] = EMPTY; - VarHandle.storeStoreFence(); - blocks[i] = null; + synchronized (sectionLocks[i]) { + blocks[i] = null; + } } return null; } @@ -140,7 +100,7 @@ public synchronized IChunkSet reset() { public void reset(int layer) { layer -= minSectionPosition; synchronized (sectionLocks[layer]) { - sections[layer] = EMPTY; + blocks[layer] = null; } } @@ -152,31 +112,17 @@ public char[] update(int layer, char[] data, boolean aggressive) { return data; } - protected char[] loadPrivately(int layer) { - layer -= getMinSectionPosition(); - if (sections[layer] != null) { - synchronized (sectionLocks[layer]) { - if (sections[layer].isFull() && blocks[layer] != null) { - return blocks[layer]; - } - } - } - return update(layer, null, true); - } - - // Not synchronized as any subsequent methods called from this class will be, or the section shouldn't appear as loaded anyway. @Override public boolean hasSection(int layer) { layer -= minSectionPosition; - return layer >= 0 && layer < sections.length && sections[layer].isFull(); + return layer >= 0 && layer < blocks.length && blocks[layer] != null; } @Override public char[] load(int layer) { layer -= minSectionPosition; - synchronized (sectionLocks[layer]) { - return sections[layer].get(this, layer); - } + char[] data = blocks[layer]; + return (data == null ? EMPTY : FULL).get(this, layer, data); } @Nullable @@ -186,7 +132,7 @@ public char[] loadIfPresent(int layer) { return null; } layer -= minSectionPosition; - return sections[layer].isFull() ? blocks[layer] : null; + return blocks[layer]; } @Override @@ -251,39 +197,18 @@ public void set(int x, int y, int z, char value) { */ public final char get(int layer, int index) { - return sections[layer - minSectionPosition].get(this, layer, index); + char[] data = blocks[layer - minSectionPosition]; + return (data == null ? EMPTY : FULL).get(this, layer, index, data); } public final void set(int layer, int index, char value) throws ArrayIndexOutOfBoundsException { - sections[layer - minSectionPosition].set(this, layer, index, value); + char[] data = blocks[layer - minSectionPosition]; + (data == null ? EMPTY : FULL).set(this, layer, index, value, data); } public abstract static class Section { - abstract char[] get(CharBlocks blocks, int layer); - - abstract char[] get(CharBlocks blocks, int layer, boolean aggressive); - - public abstract boolean isFull(); - - public final char get(CharBlocks blocks, int layer, int index) { - int normalized = layer - blocks.minSectionPosition; - char[] section = get(blocks, normalized); - if (section == null) { - synchronized (blocks.sectionLocks[normalized]) { - blocks.reset(layer); - section = EMPTY.get(blocks, normalized, false); - } - } - return section[index]; - } - - public final synchronized void set(CharBlocks blocks, int layer, int index, char value) { - layer -= blocks.minSectionPosition; - get(blocks, layer)[index] = value; - } - - static char[] getSkipFull(CharBlocks blocks, int layer, boolean aggressive) { + static char[] update(CharBlocks blocks, int layer, boolean aggressive) { char[] arr = blocks.blocks[layer]; if (arr == null) { arr = blocks.blocks[layer] = blocks.update(layer, null, aggressive); @@ -296,12 +221,24 @@ static char[] getSkipFull(CharBlocks blocks, int layer, boolean aggressive) { throw new IllegalStateException("Array cannot be null (update): " + blocks.getClass()); } } - if (blocks.blocks[layer] != null) { - blocks.sections[layer] = FULL; - } return arr; } + abstract char[] get(CharBlocks blocks, int layer, char[] data); + + abstract char[] get(CharBlocks blocks, int layer, char[] data, boolean aggressive); + + public final char get(CharBlocks blocks, int layer, int index, char[] data) { + int normalized = layer - blocks.minSectionPosition; + char[] section = get(blocks, normalized, data); + return section[index]; + } + + public final void set(CharBlocks blocks, int layer, int index, char value, char[] data) { + layer -= blocks.minSectionPosition; + get(blocks, layer, data)[index] = value; + } + } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java index cd1c1b76f4..f39268cfe5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java @@ -25,10 +25,11 @@ public BaseBlock getFullBlock(int x, int y, int z) { } @Override - public synchronized boolean trim(boolean aggressive) { + public boolean trim(boolean aggressive) { for (int i = 0; i < sectionCount; i++) { - sections[i] = EMPTY; - blocks[i] = null; + synchronized (sectionLocks[i]) { + blocks[i] = null; + } } return true; } @@ -48,11 +49,12 @@ protected char defaultOrdinal() { } @Override - public synchronized boolean trim(boolean aggressive, int layer) { + public boolean trim(boolean aggressive, int layer) { layer -= minSectionPosition; - sections[layer] = EMPTY; - blocks[layer] = null; - return true; + synchronized (sectionLocks[layer]) { + blocks[layer] = null; + return true; + } } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java index da2ba3b492..c9c453127a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java @@ -69,7 +69,7 @@ private CharSetBlocks() { } @Override - public synchronized void recycle() { + public void recycle() { reset(); POOL.offer(this); } @@ -141,7 +141,6 @@ public > boolean setBlock(int x, int y, int z, T h public void setBlocks(int layer, char[] data) { updateSectionIndexRange(layer); layer -= minSectionPosition; - this.sections[layer] = data == null ? EMPTY : FULL; this.blocks[layer] = data; } @@ -349,7 +348,7 @@ public IChunkSet reset() { @Override public boolean hasBiomes(int layer) { layer -= minSectionPosition; - if (layer < 0 || layer >= sections.length) { + if (layer < 0 || layer >= blocks.length) { return false; } return biomes != null && biomes[layer] != null; @@ -455,20 +454,16 @@ private void updateSectionIndexRange(int layer) { private void resizeSectionsArrays(int diff, boolean appendNew) { char[][] tmpBlocks = new char[sectionCount][]; - Section[] tmpSections = new Section[sectionCount]; Object[] tmpSectionLocks = new Object[sectionCount]; int destPos = appendNew ? 0 : diff; System.arraycopy(blocks, 0, tmpBlocks, destPos, blocks.length); - System.arraycopy(sections, 0, tmpSections, destPos, sections.length); - System.arraycopy(sectionLocks, 0, tmpSectionLocks, destPos, sections.length); + System.arraycopy(sectionLocks, 0, tmpSectionLocks, destPos, blocks.length); int toFillFrom = appendNew ? sectionCount - diff : 0; int toFillTo = appendNew ? sectionCount : diff; for (int i = toFillFrom; i < toFillTo; i++) { - tmpSections[i] = EMPTY; tmpSectionLocks[i] = new Object(); } blocks = tmpBlocks; - sections = tmpSections; sectionLocks = tmpSectionLocks; if (biomes != null) { BiomeType[][] tmpBiomes = new BiomeType[sectionCount][64]; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java index 4d31c33192..6aaede46ed 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java @@ -926,6 +926,7 @@ public synchronized boolean trim(boolean aggressive) { @Override public synchronized boolean trim(boolean aggressive, int layer) { + chunkExisting.trim(aggressive, layer); return this.trim(aggressive); }